有时候,需要解析非常复杂的json数据,可能层级结构非常的多,以下是两种方式来解析非常复杂的json数据:
1.net.sf.json方式:
pom:
<dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency>
解析代码:
//注意在目录结构下层是json时,用getString即可,如果遇到是数组,返回的JsonObject.getJsonArray即可,然后通过遍历来获取数组元素
public String analyzeData(String data){
try {
JSONObject jsonObject = JSONObject.fromObject(data);
String a = jsonObject.getString("a");
JSONObject json1 = JSONObject.fromObject(a);
String b = json1.getString("b");
JSONObject json2 = JSONObject.fromObject(b);
String c = json2.getString("c");
JSONObject json3 = JSONObject.fromObject(c);
JSONArray d = json3.getJSONArray("d");
Iterator<JSONArray> itr = d.iterator();
while (itr.hasNext()) {
JSONObject temp = JSONObject.fromObject(itr.next());
String e = temp.getString("e");
JSONObject jsonObject1 = JSONObject.fromObject(e);
String f = jsonObject1.getString("f");
JSONObject jsonObject2 = JSONObject.fromObject(f);
String json = jsonObject2.getString("g");
JSONObject jsonObject3 = JSONObject.fromObject(json);
String h = jsonObject3.getString("h");
JSONObject jsonObject4 = JSONObject.fromObject(h);
String response = jsonObject4.getString("response");
return response;
}
return null;
} catch (Exception e) {
logger.error("test Exception:",e);
return null;
}
}
2.codehaus.jackson方式
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> <scope>test</scope> </dependency>
解析方式:
public String analyzeData(String data){ try { return objectMapper.readTree(data).get("a").get("b").get("c").get("d") .get(0).get("e").get("f").get("g").get("h").get("i").toString(); } catch (IOException e) { logger.err("analyzeData exception:",e); } return null; }
当得到的如果是json串的话,就直接get,如果得到的是数组,可以通过get(下标)来获取即可
summary:
map转换成json,以上两种方式:
Map<String,Object> paramMap= new HashMap<>();
paramMap.put("a","b");
paramMap.put("c","d");
//net sf json
JSONObject jsonObject = JSONObject.fromObject(paramMap);
System.out.println(jsonObject.toString());
//jackson
String str = objectMapper.writeValueAsString(paramMap);
得到的结果相同。。。。
3.解析json数组:
pom:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.48</version>
</dependency>
例如数据:[{username:1,password:2},{username:3,password:4}]
解析成List<User>
List<User> userList = (ArrayList<User>)JSON.parseArray(result, User.class);