JAVA——利用Map集合,再复杂的JSON数据转换都不慌!

在我们悲催的码农开发过程中百分百会接触到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()来转换,不然会报错!

 

The end !!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值