在我们悲催的码农开发过程中百分百会接触到Json数据,并且有时候还需要把JSON数据转换成JAVA对象,简单的JSON数据转换成JAVA对象很简单,简单的JSON数据可能只需要两个JAVA类,一个接收最外层的数据,一个接收集合,但是对于复杂的JSON,有很多层而且不规则,那么再用这种方法一个个转就很愚蠢了!
这个时候就用Map集合来操作它就行,我相信都不需要我说的很清楚你就可以一点就通~就拿我最近碰到的一个案例来说~
最近在项目中接入顺丰API来实时查询物流信息,查询出来的JSON数据相对于普通的要稍微复杂一点点点点点,就拿它举个例子
{
"Response": {
"Head": "OK",
"service": "RouteService",
"Body": {
"RouteResponse": {
"mailno": 444000092295,
"orderid": "QIAO-20180104001",
"Route": [{
"accept_address": "广东省深圳市软件产业基地",
"remark": "顺丰速运 已收取快件(测试数据)",
"opcode": 50,
"accept_time": "2018-05-01 08:01:44"
}, {
"accept_address": "广东省深圳市软件产业基地",
"remark": "已签收,感谢使用顺丰,期待再次为您服务(测试数据)",
"opcode": 80,
"accept_time": "2018-05-02 12:01:44"
}]
}
}
}
}
在这段JSON数据中,其实对于我来说有用的只是“Route”下对应的数据,我现在想把它转换成这样的一个JAVA对象
public class ShunFengVo {
private String accept_address;
private String remark;
private Integer opcode;
private String accept_time;
public String getAccept_address() {
return accept_address;
}
public void setAccept_address(String accept_address) {
this.accept_address = accept_address;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Integer getOpcode() {
return opcode;
}
public void setOpcode(Integer opcode) {
this.opcode = opcode;
}
public String getAccept_time() {
return accept_time;
}
public void setAccept_time(String accept_time) {
this.accept_time = accept_time;
}
}
好方便我去前端页面遍历显示数据,也许还需要 “mailno”这个字段,因为他是物流运单号,当然这也是小问题啦
接下来看我操作
package com.sixmac.platform.model.vo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sixmac.core.annotation.Json;
import com.sixmac.core.toolbox.kit.JsonKit;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
/**
* {
* "Response": {
* "Head": "OK",
* "service": "RouteService",
* "Body": {
* "RouteResponse": {
* "mailno": 444000092295,
* "orderid": "QIAO-20180104001",
* "Route": [{
* "accept_address": "广东省深圳市软件产业基地",
* "remark": "顺丰速运 已收取快件(测试数据)",
* "opcode": 50,
* "accept_time": "2018-05-01 08:01:44"
* }, {
* "accept_address": "广东省深圳市软件产业基地",
* "remark": "已签收,感谢使用顺丰,期待再次为您服务(测试数据)",
* "opcode": 80,
* "accept_time": "2018-05-02 12:01:44"
* }]* }* }
* }
* }
*/
public class ShunFengModel {
public static void main(String[] args) {
String s="{\n" +
"\t\"Response\": {\n" +
"\t\t\"Head\": \"OK\",\n" +
"\t\t\"service\": \"RouteService\",\n" +
"\t\t\"Body\": {\n" +
"\t\t\t\"RouteResponse\": {\n" +
"\t\t\t\t\"mailno\": 444000092295,\n" +
"\t\t\t\t\"orderid\": \"QIAO-20180104001\",\n" +
"\t\t\t\t\"Route\": [{\n" +
"\t\t\t\t\t\"accept_address\": \"广东省深圳市软件产业基地\",\n" +
"\t\t\t\t\t\"remark\": \"顺丰速运 已收取快件(测试数据)\",\n" +
"\t\t\t\t\t\"opcode\": 50,\n" +
"\t\t\t\t\t\"accept_time\": \"2018-05-01 08:01:44\"\n" +
"\t\t\t\t}, {\n" +
"\t\t\t\t\t\"accept_address\": \"广东省深圳市软件产业基地\",\n" +
"\t\t\t\t\t\"remark\": \"已签收,感谢使用顺丰,期待再次为您服务(测试数据)\",\n" +
"\t\t\t\t\t\"opcode\": 80,\n" +
"\t\t\t\t\t\"accept_time\": \"2018-05-02 12:01:44\"\n" +
"\t\t\t\t}]\n" +
"\t\t\t}\n" +
"\t\t}\n" +
"\t}\n" +
"}";
Map map4 = JSON.parseObject(s, Map.class);
System.out.println(map4.toString());
}
}
s就是那串JSON,首先通过JSON提供的方法转行成一个Map集合转然后toString,这个时候,"Response"就相当于是key,后面的数据就是value
打印出来的结果
{Response={"Head":"OK","service":"RouteService","Body":{"RouteResponse":{"mailno":444000092295,"orderid":"QIAO-20180104001","Route":[{"accept_address":"广东省深圳市软件产业基地","remark":"顺丰速运 已收取快件(测试数据)","opcode":50,"accept_time":"2018-05-01 08:01:44"},{"accept_address":"广东省深圳市软件产业基地","remark":"已签收,感谢使用顺丰,期待再次为您服务(测试数据)","opcode":80,"accept_time":"2018-05-02 12:01:44"}]}}}}
这个时候我们只需要这个“Response”的value,就直接取出value然后转成String就行
String s1 = map.get("Response").toString();
这个时候打印出来的数据是这样的
{"Head":"OK","service":"RouteService","Body":{"RouteResponse":{"mailno":444000092295,"orderid":"QIAO-20180104001","Route":[{"accept_address":"广东省深圳市软件产业基地","remark":"顺丰速运 已收取快件(测试数据)","opcode":50,"accept_time":"2018-05-01 08:01:44"},{"accept_address":"广东省深圳市软件产业基地","remark":"已签收,感谢使用顺丰,期待再次为您服务(测试数据)","opcode":80,"accept_time":"2018-05-02 12:01:44"}]}}}
然后再把这段数据通过上面一样的方法转为Map
Map map1 = JSON.parseObject(s1, Map.class);
转行为String类型打印出来的数据如下
{Head=OK, service=RouteService, Body={"RouteResponse":{"mailno":444000092295,"orderid":"QIAO-20180104001","Route":[{"accept_address":"广东省深圳市软件产业基地","remark":"顺丰速运 已收取快件(测试数据)","opcode":50,"accept_time":"2018-05-01 08:01:44"},{"accept_address":"广东省深圳市软件产业基地","remark":"已签收,感谢使用顺丰,期待再次为您服务(测试数据)","opcode":80,"accept_time":"2018-05-02 12:01:44"}]}}}
相信到这里基本上的思路已经都有了,可以看到我们需要的数据在Body中,我们按照上面一模一样的思路取出Body的value并转换为String类型!
String s2 = map1.get("Body").toString();
System.out.println(s2);
打印出来的结果如下
{"RouteResponse":{"mailno":444000092295,"orderid":"QIAO-20180104001","Route":[{"accept_address":"广东省深圳市软件产业基地","remark":"顺丰速运 已收取快件(测试数据)","opcode":50,"accept_time":"2018-05-01 08:01:44"},{"accept_address":"广东省深圳市软件产业基地","remark":"已签收,感谢使用顺丰,期待再次为您服务(测试数据)","opcode":80,"accept_time":"2018-05-02 12:01:44"}]}}
可以看到离我们需要的数据越来越近了
然后相信你们都已经会了,只需要继续重复上面的步骤转换类型然后取出value即可!
Map map2 = JSON.parseObject(s2, Map.class);
System.out.println(map2.toString());
打印出来的结果
{RouteResponse={"mailno":444000092295,"orderid":"QIAO-20180104001","Route":[{"accept_address":"广东省深圳市软件产业基地","remark":"顺丰速运 已收取快件(测试数据)","opcode":50,"accept_time":"2018-05-01 08:01:44"},{"accept_address":"广东省深圳市软件产业基地","remark":"已签收,感谢使用顺丰,期待再次为您服务(测试数据)","opcode":80,"accept_time":"2018-05-02 12:01:44"}]}}
只需要取出RouteResponse的value转换为String就OK了
String s3 = map2.get("RouteResponse").toString();
System.out.println(s3);
打印
{"mailno":444000092295,"orderid":"QIAO-20180104001","Route":[{"accept_address":"广东省深圳市软件产业基地","remark":"顺丰速运 已收取快件(测试数据)","opcode":50,"accept_time":"2018-05-01 08:01:44"},{"accept_address":"广东省深圳市软件产业基地","remark":"已签收,感谢使用顺丰,期待再次为您服务(测试数据)","opcode":80,"accept_time":"2018-05-02 12:01:44"}]}
到这里已经转换成我们最常见最简单的JSON格式了,里面的数据基本上都是我们所需要的,接下来的我相信不用写,你们也能知道该怎么做了。
需要注意的是想把 Route中的数据转换为JAVA对象的时候要用这个方法
List<ShunFengVo> list = JSON.parseArray(route, ShunFengVo.class);
因为它的最外层有一个[ ],转换的时候会把它当一个数组,所以要用JSON.parseArray()来转换,不然会报错!