1. 程式人生 > >JackSon解析json字串

JackSon解析json字串

原文:http://blog.csdn.net/java_huashan/article/details/9353903

概述

jackson解析json例子

準備工作

基於JDK1.7,依賴Jackson框架類庫:

jackson-core-2.5.3.jar
jackson-databind-2.5.3.jar

Example

下面的例子是基於Jackson 2.x版本的樹模型的Json解析。

要解析的Json字串:

  1. String data = {  
  2.             "type":2,"range":1,"start":1368417600,"end":1368547140,"cityName":"天津",  
  3.             "companyIds":["12000001"],  
  4.             "companyNames":["天津"],  
  5.             "12000001":{  
  6.                 "data":[47947,48328,48573,48520],  
  7.                 "timestamps":[1368417600,1368417900,1368418200,1368418500]  
  8.             }  
  9.     }  

示例程式碼:

  1. package com.cennavi.dqe.test;  
  2. import java.io.IOException;  
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import java.util.TimeZone;  
  6. import com.fasterxml.jackson.core.JsonProcessingException;  
  7. import com.fasterxml.jackson.databind.JsonNode;  
  8. import com.fasterxml.jackson.databind.ObjectMapper;  
  9. publicclass ParseJsonTest {  
  10.     /** 
  11.      * @param args
     
  12.      */
  13.     publicstaticvoid main(String[] args) {  
  14.         String data = "{\"type\":2,\"range\":1,\"start\":1368417600,\"end\":1368547140,"
  15.                 + "\"cityName\":\"天津\",\"companyIds\":[\"12000001\"],\"companyNames\":[\"天津\"],"
  16.                 + "\"12000001\":{\"data\":[47947,48328,48573,48520],"
  17.                 + "\"timestamps\":[1368417600,1368417900,1368418200,1368418500]}}";  
  18.         String data2 = parseJson(data);  
  19.         System.out.println(data2);  
  20.     }  
  21.     publicstatic String parseJson(String data) {  
  22.         // 用來展現解析Json得到的值
  23.         StringBuffer buf = new StringBuffer();  
  24.         try {  
  25.             ObjectMapper mapper = new ObjectMapper();  
  26.             JsonNode rootNode = mapper.readTree(data); // 讀取Json
  27.             // rootNode.path("xx")返回的還是一個JsonNode物件,呼叫該JsonNode的相應方法,得到鍵對應的值
  28.             int type = rootNode.path("type").asInt();  
  29.             int range = rootNode.path("range").asInt();  
  30.             long start = rootNode.path("start").asLong();  
  31.             long end = rootNode.path("end").asLong();  
  32.             String cityName = rootNode.path("cityName").asText();  
  33.             // 轉換時間格式
  34.             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");  
  35.             sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));  
  36.             String str = "型別(type):" + type + "\r\n" + "範圍(range):" + range  
  37.                     + "\r\n" + "開始時間(start):"
  38.                     + sdf.format(new Date(start * 1000)) + "\r\n"
  39.                     + "結束時間(end):" + sdf.format(new Date(end * 1000)) + "\r\n"
  40.                     + "城市名稱(cityName):" + cityName;  
  41.             buf.append(str);  
  42.             // 得到companyIds的JsonNode物件
  43.             JsonNode companyIds = rootNode.path("companyIds");  
  44.             JsonNode companyNames = rootNode.path("companyNames");  
  45.             // 遍歷companyIds中的內容
  46.             for (int i = 0; i < companyIds.size(); i++) {  
  47.                 String companyId = companyIds.get(i).asText();  
  48.                 // 本例解析的Json字串中companyIds與companyNames的長度是相同的,所有直接遍歷companyNames
  49.                 String companyName = companyNames.get(i).asText();  
  50.                 // companyId的值:12000001,對應Json串中的
  51.                 // "12000001":{"data":[...],"timestamps":[....]}
  52.                 JsonNode infoNode = rootNode.path(companyId);  
  53.                 // 得到"12000001":{"data":[...],"timestamps":[....]}中的data和timestamps的JsonNode物件
  54.                 JsonNode dataNode = infoNode.path("data");  
  55.                 JsonNode timestampsNode = infoNode.path("timestamps");  
  56.                 // 遍歷data和timestamps 本例中data.size與timestamps.size是相等的
  57.                 buf.append("\r\n{\r\n  公司ID(companyId):" + companyId  
  58.                         + "\r\n  公司名稱(companyName):" + companyName + "\r\n"
  59.                         + " data:");  
  60.                 for (int j = 0; j < dataNode.size(); j++) {  
  61.                     long dataValue = dataNode.get(j).asLong();  
  62.                     buf.append(dataValue + ",");  
  63.                 }  
  64.                 buf.append("\r\n time:");  
  65.                 for (int k = 0; k < timestampsNode.size(); k++) {  
  66.                     long timeValue = timestampsNode.get(k).asLong();  
  67.                     buf.append(sdf.format(new Date(timeValue * 1000)) + ",");  
  68.                 }  
  69.                 buf.append("\r\n}\r\n");  
  70.             }  
  71.         } catch (JsonProcessingException e) {  
  72.             e.printStackTrace();  
  73.         } catch (IOException e) {  
  74.             // TODO 自動生成的 catch 塊
  75.             e.printStackTrace();  
  76.         }  
  77.         return buf.toString();  
  78.     }  
  79. }  

測試結果:

  1. 型別(type):2
  2. 範圍(range):1
  3. 開始時間(start):201305131200
  4. 結束時間(end):201305142359
  5. 城市名稱(cityName):天津  
  6. {  
  7.   公司ID(companyId):12000001
  8.   公司名稱(companyName):天津  
  9.   data:47947,48328,48573,48520,  
  10.   time:201305131200,201305131205,201305131210,201305131215