在工作中实际使用到Java处理JSON的情况,且有很大部分都使用的是开源工具Jackson实现的。

一.入门

        Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换。

1.Java对象转换为JSON



Java代码  


  1. Student st=new Student(); //Java Object  
  2. ObjectMapper mapper = new ObjectMapper();  
  3. java.text.DateFormat myFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  4. mapper.getSerializationConfig().setDateFormat(myFormat);  
  5. try {  
  6.     //返回字符串  
  7.     String res = mapper.writeValueAsString(st);  
  8.     System.out.println(res);  
  9.       
  10.     //输出格式化后的字符串(有性能损耗)  
  11.     res = mapper.defaultPrettyPrintingWriter().writeValueAsString(st);  
  12.     System.out.println(res);  
  13.       
  14.     mapper.writeValue(new File("D:\\st.json"), st); //指定文件写入  
  15.        
  16.     //设置序列化配置(全局),设置序列化时不输出空值.  
  17.     mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);  
  18.       
  19.     res = mapper.writeValueAsString(st);  
  20.     System.out.println(res);  
  21. } catch (Exception e) {  
  22.     e.printStackTrace();  
  23. }  
Student st=new Student(); //Java Object
ObjectMapper mapper = new ObjectMapper();
java.text.DateFormat myFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mapper.getSerializationConfig().setDateFormat(myFormat);
try {
//返回字符串
String res = mapper.writeValueAsString(st);
System.out.println(res);
//输出格式化后的字符串(有性能损耗)
res = mapper.defaultPrettyPrintingWriter().writeValueAsString(st);
System.out.println(res);

mapper.writeValue(new File("D:\\st.json"), st); //指定文件写入

//设置序列化配置(全局),设置序列化时不输出空值.
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);

res = mapper.writeValueAsString(st);
System.out.println(res);


} catch (Exception e) {

e.printStackTrace();

}

 

2.JSON反序列化为Java对象



Java代码  


  1. String json = "{\"error\":0,\"data\":{\"name\":\"ABC\",\"age\":20,\"phone\":{\"home\":\"abc\",\"mobile\":\"def\"},\"friends\":[{\"name\":\"DEF\",\"phone\":{\"home\":\"hij\",\"mobile\":\"klm\"}},{\"name\":\"GHI\",\"phone\":{\"home\":\"nop\",\"mobile\":\"qrs\"}}]},\"other\":{\"nickname\":[]}}";  
  2. ObjectMapper mapper = new ObjectMapper();  
  3. //解析器支持解析单引号  
  4. mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true);  
  5. //解析器支持解析结束符  
  6. mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);  
  7. try {  
  8.     //转换为HashMap对象  
  9.     HashMap jsonMap = mapper.readValue(json, HashMap.class);  
  10.     Map<String, Map<String, Object>> maps = objectMapper.readValue(json, Map.class);  
  11.     System.out.println(maps.get("error"));//0  
  12.     System.out.println((Object) (maps.get("data").get("phone")));//{home=abc, mobile=def}  
  13. } catch (Exception e) {  
  14.     e.printStackTrace();  
  15. }  
String json = "{\"error\":0,\"data\":{\"name\":\"ABC\",\"age\":20,\"phone\":{\"home\":\"abc\",\"mobile\":\"def\"},\"friends\":[{\"name\":\"DEF\",\"phone\":{\"home\":\"hij\",\"mobile\":\"klm\"}},{\"name\":\"GHI\",\"phone\":{\"home\":\"nop\",\"mobile\":\"qrs\"}}]},\"other\":{\"nickname\":[]}}";
ObjectMapper mapper = new ObjectMapper();
//解析器支持解析单引号
mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true);
//解析器支持解析结束符
mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
try {
//转换为HashMap对象
HashMap jsonMap = mapper.readValue(json, HashMap.class);
Map<String, Map<String, Object>> maps = objectMapper.readValue(json, Map.class);
System.out.println(maps.get("error"));//0
System.out.println((Object) (maps.get("data").get("phone")));//{home=abc, mobile=def}
} catch (Exception e) {
e.printStackTrace();
}


 

二.Jackson支持三种使用方式

1.Data Binding:最方便使用

(1)Full Data Binding



Java代码  


  1. /* 
  2.  * Full Data Binding 
  3.  */  
  4. public static void fullDataBinding() {  
  5.   
  6.     ObjectMapper mapper = new ObjectMapper();  
  7.     try {  
  8.         Model model = mapper.readValue(MODEL_BINDING, Model.class);  
  9.         //readValue到一个实体类中.    
  10.         System.out.println(model.getName()); //name1   
  11.         System.out.println(model.getType()); //1  
  12.     } catch (Exception e) {  
  13.         e.printStackTrace();  
  14.     }  
  15. }  
  16.   
  17. private static class Model {  
  18.     private String name;  
  19.     private int type;  
  20.   
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.   
  25.     public void setName(String name) {  
  26.          = name;  
  27.     }  
  28.   
  29.     public int getType() {  
  30.         return type;  
  31.     }  
  32.   
  33.     public void setType(int type) {  
  34.         this.type = type;  
  35.     }  
  36. }  
/*
* Full Data Binding
*/
public static void fullDataBinding() {
ObjectMapper mapper = new ObjectMapper();
try {
Model model = mapper.readValue(MODEL_BINDING, Model.class);
//readValue到一个实体类中.
System.out.println(model.getName()); //name1
System.out.println(model.getType()); //1
} catch (Exception e) {
e.printStackTrace();
}


}

private static class Model {

private String name;

private int type;

public String getName() {
return name;
}

public void setName(String name) {
= name;
}

public int getType() {
return type;
}

public void setType(int type) {
this.type = type;
}


}

 

(2)Raw Data Binding



Java代码  


  1. /* 
  2.  * Raw Data Binding 
  3.  */  
  4. public static void rawDataBinding() {  
  5.     ObjectMapper mapper = new ObjectMapper();  
  6.     try {  
  7.         HashMap map = mapper.readValue(MODEL_BINDING, HashMap.class);//readValue到一个原始数据类型.    
  8.         System.out.println(map.get("name")); //name1  
  9.         System.out.println(map.get("type")); //1  
  10.     } catch (Exception e) {  
  11.         e.printStackTrace();  
  12.     }  
  13. }  
/*
* Raw Data Binding
*/
public static void rawDataBinding() {
ObjectMapper mapper = new ObjectMapper();
try {
HashMap map = mapper.readValue(MODEL_BINDING, HashMap.class);//readValue到一个原始数据类型.
System.out.println(map.get("name")); //name1
System.out.println(map.get("type")); //1
} catch (Exception e) {
e.printStackTrace();
}
}


 

(3)generic Data Binding



Java代码  


  1. /* 
  2.  * generic Data Binding 
  3.  */  
  4. public static void genericDataBinding() {  
  5.       
  6.     ObjectMapper mapper = new ObjectMapper();  
  7.     try {  
  8.         HashMap<String, Model> modelMap = mapper.readValue(GENERIC_BINDING,  
  9.                 new TypeReference<HashMap<String, Model>>() {  
  10.                 });//readValue到一个范型数据中.    
  11.         Model model = modelMap.get("key2");  
  12.         System.out.println(model.getName()); //name3  
  13.         System.out.println(model.getType()); //3  
  14.     } catch (Exception e) {  
  15.         e.printStackTrace();  
  16.     }  
  17. }  
/*
* generic Data Binding
*/
public static void genericDataBinding() {
ObjectMapper mapper = new ObjectMapper();
try {
HashMap<String, Model> modelMap = mapper.readValue(GENERIC_BINDING,
new TypeReference<HashMap<String, Model>>() {
});//readValue到一个范型数据中.
Model model = modelMap.get("key2");
System.out.println(model.getName()); //name3
System.out.println(model.getType()); //3
} catch (Exception e) {
e.printStackTrace();
}


}

 

2.Tree Model:最灵活



Java代码  


  1. /* 
  2.  * Tree Model:最灵活 
  3.  */  
  4. public static void treeModelBinding() {  
  5.     ObjectMapper mapper = new ObjectMapper();  
  6.     try {  
  7.         JsonNode rootNode = mapper.readTree(TREE_MODEL_BINDING);  
  8.         //path与get作用相同,但是当找不到该节点的时候,返回missing node而不是Null.    
  9.         String treekey2value = rootNode.path("treekey2").getTextValue();//    
  10.         System.out.println("treekey2value:" + treekey2value);  
  11.         JsonNode childrenNode = rootNode.path("children");  
  12.         String childkey1Value = childrenNode.get(0).path("childkey1").getTextValue();  
  13.         System.out.println("childkey1Value:" + childkey1Value);  
  14.   
  15.         //创建根节点    
  16.         ObjectNode root = mapper.createObjectNode();  
  17.         //创建子节点1    
  18.         ObjectNode node1 = mapper.createObjectNode();  
  19.         node1.put("nodekey1", 1);  
  20.         node1.put("nodekey2", 2);  
  21.         //绑定子节点1    
  22.         root.put("child", node1);  
  23.         //数组节点    
  24.         ArrayNode arrayNode = mapper.createArrayNode();  
  25.         arrayNode.add(node1);  
  26.         arrayNode.add(1);  
  27.         //绑定数组节点    
  28.         root.put("arraynode", arrayNode);  
  29.         //JSON读到树节点    
  30.         JsonNode valueToTreeNode = mapper.valueToTree(TREE_MODEL_BINDING);  
  31.         //绑定JSON节点    
  32.         root.put("valuetotreenode", valueToTreeNode);  
  33.         //JSON绑定到JSON节点对象    
  34.         JsonNode bindJsonNode = mapper.readValue(GENERIC_BINDING, JsonNode.class);//绑定JSON到JSON节点对象.    
  35.         //绑定JSON节点    
  36.         root.put("bindJsonNode", bindJsonNode);  
  37.         System.out.println(mapper.writeValueAsString(root));  
  38.     } catch (Exception e) {  
  39.         e.printStackTrace();  
  40.     }  
  41. }  
/*
* Tree Model:最灵活
*/
public static void treeModelBinding() {
ObjectMapper mapper = new ObjectMapper();
try {
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));
} catch (Exception e) {
e.printStackTrace();
}


}

 

3.Streaming API。最佳性能

见官方文档例子。