使用Jackson在Java中處理JSON
一、入門
Jackson中有個ObjectMapper類很是實用,用於Java物件與JSON的互換。
1、Java物件轉換為JSON:
User user=new User(); //Java Object
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(user); //返回字串
//輸出格式化後的字串(有效能損耗)
mapper.defaultPrettyPrintingWriter().writeValueAsString(user);
mapper.writeValue(new File("c:\\user.json"), user); //指定檔案寫入
//設定序列化配置(全域性),設定序列化時不輸出空值.
sharedMapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);
2、JSON反序列化為Java物件:
ObjectMapper mapper = new ObjectMapper();
//解析器支援解析單引號
mapper.configure(Feature.ALLOW_SINGLE_QUOTES,true);
//解析器支援解析結束符
mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS,true);
HashMap jsonMap = mapper.readValue(json,HashMap.class); //轉換為HashMap物件
二、Jackson支援3種使用方式:
1、Data Binding:最方便使用.
(1)Full Data Binding:
- private static final String MODEL_BINDING = "{\"name\":\"name1\",\"type\":1}";
- public void fullDataBinding() throws Exception{
- ObjectMapper mapper = new ObjectMapper();
- Model user = mapper.readValue(MODEL_BINDING, Model.class);//readValue到一個實體類中.
- System.out.println(user.getName());
- System.out.println(user.getType());
- }
Model類:
- private static class Model{
- private String name;
- private int type;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getType() {
- return type;
- }
- public void setType(int type) {
- this.type = type;
- }
- }
(2)Raw Data Binding:
- /**
- Concrete Java types that Jackson will use for simple data binding are:
- JSON Type Java Type
- object LinkedHashMap<String,Object>
- array ArrayList<Object>
- string String
- number(no fraction) Integer, Long or BigInteger (smallest applicable)
- number(fraction) Double(configurable to use BigDecimal)
- true|false Boolean
- null null
- */
- public void rawDataBinding() throws Exception{
- ObjectMapper mapper = new ObjectMapper();
- HashMap map = mapper.readValue(MODEL_BINDING,HashMap.class);//readValue到一個原始資料型別.
- System.out.println(map.get("name"));
- System.out.println(map.get("type"));
- }
(3)generic Data Binding:
- private static final String GENERIC_BINDING = "{\"key1\":{\"name\":\"name2\",\"type\":2},\"key2\":{\"name\":\"name3\",\"type\":3}}";
- public void genericDataBinding() throws Exception{
- ObjectMapper mapper = new ObjectMapper();
- HashMap<String,Model> modelMap = mapper.readValue(GENERIC_BINDING,new TypeReference<HashMap<String,Model>>(){});//readValue到一個範型資料中.
- Model model = modelMap.get("key2");
- System.out.println(model.getName());
- System.out.println(model.getType());
- }
2、Tree Model:最靈活。
- private static final String TREE_MODEL_BINDING = "{\"treekey1\":\"treevalue1\",\"treekey2\":\"treevalue2\",\"children\":[{\"childkey1\":\"childkey1\"}]}";
- public void treeModelBinding() throws Exception{
- ObjectMapper mapper = new ObjectMapper();
- JsonNode rootNode = mapper.readTree(TREE_MODEL_BINDING);
- //path與get作用相同,但是當找不到該節點的時候,返回missing node而不是Null.
- String treekey2value = rootNode.path("treekey2").getTextValue();//
- System.out.println("treekey2value:" + treekey2value);
- JsonNode childrenNode = rootNode.path("children");
- String childkey1Value = childrenNode.get(0).path("childkey1").getTextValue();
- System.out.println("childkey1Value:"+childkey1Value);
- //建立根節點
- ObjectNode root = mapper.createObjectNode();
- //建立子節點1
- ObjectNode node1 = mapper.createObjectNode();
- node1.put("nodekey1",1);
- node1.put("nodekey2",2);
- //繫結子節點1
- root.put("child",node1);
- //陣列節點
- ArrayNode arrayNode = mapper.createArrayNode();
- arrayNode.add(node1);
- arrayNode.add(1);
- //繫結陣列節點
- root.put("arraynode", arrayNode);
- //JSON讀到樹節點
- JsonNode valueToTreeNode = mapper.valueToTree(TREE_MODEL_BINDING);
- //繫結JSON節點
- root.put("valuetotreenode",valueToTreeNode);
- //JSON繫結到JSON節點物件
- JsonNode bindJsonNode = mapper.readValue(GENERIC_BINDING, JsonNode.class);//繫結JSON到JSON節點物件.
- //繫結JSON節點
- root.put("bindJsonNode",bindJsonNode);
- System.out.println(mapper.writeValueAsString(root));
- }
3、Streaming API:最佳效能。
見官方文件例子。
參考資料:
1、http://wiki.fasterxml.com/JacksonInFiveMinutes Jackson官方教程示例
2、http://wiki.fasterxml.com/JacksonJavaDocs Jackson線上API文件
3、http://hjg1988.iteye.com/blog/561368 JSON工具效能比較:json-lib和jackson進行Java物件到json字串序列化。
相關文章
- Java JSON處理類庫JacksonJavaJSON
- 在REST SOE中處理JSONRESTJSON
- FastJson、Jackson、Gson進行Java物件轉換Json的細節處理ASTJSONJava物件
- java 如何簡單快速處理 json 中的資料JavaJSON
- 使用IBM Rational Software Architect 在Java中處理XSDIBMJava
- 7. Jackson用樹模型處理JSON是必備技能,不信你看模型JSON
- jackson時間格式的處理
- Java基礎-處理json字串解析案例JavaJSON字串
- 「譯」使用 System.Net.Http.Json 高效處理JsonHTTPJSON
- 使用Java處理JSON結構化資料 -Advanced Web MachineryJavaJSONWebMac
- Java 11:在Java中處理HTTP和WebSocket的新方法!JavaHTTPWeb
- 在oracle中處理日期Oracle
- java中的事件處理Java事件
- URL及日期等特殊資料格式處理-JSON框架Jackson精解第2篇JSON框架
- JSON簡介(java中的json庫使用)JSONJava
- Json工具類----JacksonJSON
- JSON在Python中的使用JSONPython
- java 請求HTTP返回json集合,物件處理方式JavaHTTPJSON物件
- Python處理JSONPythonJSON
- 處理JSON資料JSON
- [HandyJSON] 在Swift語言中處理JSON - 轉換JSON和ModelJSONSwift
- 在處理鏈中呼叫APD
- SpringMVC處理Json-使用 HttpMessageConverterSpringMVCJSONHTTP
- 使用awk批處理在字串中增加特殊符號字串符號
- java中json的使用方法JavaJSON
- java當中的批處理Java
- Java 中的並行處理Java並行
- JMeter中對於Json資料的處理方法JMeterJSON
- 使用JAXB處理JAVA和XMLJavaXML
- 使用Java處理大檔案Java
- 在Python中處理分數Python
- PostgreSQL處理JSON入門SQLJSON
- flutter json資料處理FlutterJSON
- flutter demo (三):json處理FlutterJSON
- golang json處理問題GolangJSON
- Hive處理Json資料HiveJSON
- Java XML和JSON:Java SE的文件處理,第1部分JavaXMLJSON
- Java XML和JSON:Java SE的文件處理 第2部分JavaXMLJSON