在工作中實際使用到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字符串序列化。
