在工作中实际使用到Java处理JSON的情况,且有很大部分都使用的是开源工具Jackson实现的。
一.入门
Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换。
1.Java对象转换为JSON
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对象
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
/* * 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) { this.name = name; } public int getType() { return type; } public void setType(int type) { this.type = type; } }
(2)Raw Data Binding
/* * 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
/* * 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:最灵活
/* * 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。最佳性能
见官方文档例子。
进一步学习资料:
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字符串序列化。
文章来源:http://shensy.iteye.com/blog/1717776