使用Jackson在Java中處理JSON

工程師WWW發表於2015-06-12

一、入門

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:

Java程式碼  收藏程式碼
  1. private static final String MODEL_BINDING = "{\"name\":\"name1\",\"type\":1}";  
  2.     public void fullDataBinding() throws Exception{  
  3.         ObjectMapper mapper = new ObjectMapper();  
  4.         Model user = mapper.readValue(MODEL_BINDING, Model.class);//readValue到一個實體類中.  
  5.         System.out.println(user.getName());  
  6.         System.out.println(user.getType());  
  7.     }  

Model類:

Java程式碼  收藏程式碼
  1. private static class Model{  
  2.         private String name;  
  3.         private int type;  
  4.           
  5.         public String getName() {  
  6.             return name;  
  7.         }  
  8.         public void setName(String name) {  
  9.             this.name = name;  
  10.         }  
  11.         public int getType() {  
  12.             return type;  
  13.         }  
  14.         public void setType(int type) {  
  15.             this.type = type;  
  16.         }  
  17.     }  

(2)Raw Data Binding:

Java程式碼  收藏程式碼
  1. /** 
  2.     Concrete Java types that Jackson will use for simple data binding are: 
  3.     JSON Type       Java Type 
  4.     object          LinkedHashMap<String,Object> 
  5.     array           ArrayList<Object> 
  6.     string          String 
  7.     number(no fraction) Integer, Long or BigInteger (smallest applicable) 
  8.     number(fraction)    Double(configurable to use BigDecimal) 
  9.     true|false      Boolean 
  10.     null            null 
  11.     */  
  12.     public void rawDataBinding() throws Exception{  
  13.         ObjectMapper mapper = new ObjectMapper();  
  14.         HashMap map = mapper.readValue(MODEL_BINDING,HashMap.class);//readValue到一個原始資料型別.  
  15.         System.out.println(map.get("name"));  
  16.         System.out.println(map.get("type"));  
  17.     }  

 (3)generic Data Binding:

Java程式碼  收藏程式碼
  1. private static final String GENERIC_BINDING = "{\"key1\":{\"name\":\"name2\",\"type\":2},\"key2\":{\"name\":\"name3\",\"type\":3}}";  
  2.     public void genericDataBinding() throws Exception{  
  3.         ObjectMapper mapper = new ObjectMapper();  
  4.         HashMap<String,Model> modelMap = mapper.readValue(GENERIC_BINDING,new TypeReference<HashMap<String,Model>>(){});//readValue到一個範型資料中.  
  5.         Model model = modelMap.get("key2");  
  6.         System.out.println(model.getName());  
  7.         System.out.println(model.getType());  
  8.     }  

2、Tree Model:最靈活。

Java程式碼  收藏程式碼
  1. private static final String TREE_MODEL_BINDING = "{\"treekey1\":\"treevalue1\",\"treekey2\":\"treevalue2\",\"children\":[{\"childkey1\":\"childkey1\"}]}";  
  2.     public void treeModelBinding() throws Exception{  
  3.         ObjectMapper mapper = new ObjectMapper();  
  4.         JsonNode rootNode = mapper.readTree(TREE_MODEL_BINDING);  
  5.         //path與get作用相同,但是當找不到該節點的時候,返回missing node而不是Null.  
  6.         String treekey2value = rootNode.path("treekey2").getTextValue();//  
  7.         System.out.println("treekey2value:" + treekey2value);  
  8.         JsonNode childrenNode = rootNode.path("children");  
  9.         String childkey1Value = childrenNode.get(0).path("childkey1").getTextValue();  
  10.         System.out.println("childkey1Value:"+childkey1Value);  
  11.           
  12.         //建立根節點  
  13.         ObjectNode root = mapper.createObjectNode();  
  14.         //建立子節點1  
  15.         ObjectNode node1 = mapper.createObjectNode();  
  16.         node1.put("nodekey1",1);  
  17.         node1.put("nodekey2",2);  
  18.         //繫結子節點1  
  19.         root.put("child",node1);  
  20.         //陣列節點  
  21.         ArrayNode arrayNode = mapper.createArrayNode();  
  22.         arrayNode.add(node1);  
  23.         arrayNode.add(1);  
  24.         //繫結陣列節點  
  25.         root.put("arraynode", arrayNode);  
  26.         //JSON讀到樹節點  
  27.         JsonNode valueToTreeNode = mapper.valueToTree(TREE_MODEL_BINDING);  
  28.         //繫結JSON節點  
  29.         root.put("valuetotreenode",valueToTreeNode);  
  30.         //JSON繫結到JSON節點物件  
  31.         JsonNode bindJsonNode = mapper.readValue(GENERIC_BINDING, JsonNode.class);//繫結JSON到JSON節點物件.  
  32.         //繫結JSON節點  
  33.         root.put("bindJsonNode",bindJsonNode);  
  34.         System.out.println(mapper.writeValueAsString(root));  
  35.     }  

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字串序列化。

相關文章