JSONObject和JSONArray的简单使用

JSONObject和JSONArray的简单使用

前言

一直以来,都是用对象来装请求或响应的数据。这样有好处也有坏处。

好处:将请求或响应的具体数据与对象的属性一一对应起来。方便维护,一般情况下也是推荐使用对象。

坏处:如果收到的请求或响应数据变更了,原来对象属性不满足变更后的请求或响应。这个时候就会报错。如:别人的接口新增了一个返回字段 msgCode,但是咋们定义的响应对象没有这个字段。

ps:很多正式的机构在更新系统后,会发布更新内容,一般会兼容以前的接口。

还有另一外的情况:例如网关系统后者中转系统。这些系统是不会对请求做业务处理的。而且为了兼容性,也不可能事先准备了所有的请求/响应格式。这个时候JSONObject 和JSONArray就有用了。

数据格式

栗子:我会收到这么一个请求,但是我的需求只是检查data是否有数据,然后将data内的数据推送到另一个系统去。

{
  "ret": 0,
  "msg": "OK",
  "code_msg": "OK!",
  "data": [
    {
      "imei": "862459047225011",
      "acc_seconds": 5905
    },
    {
      "imei": "862459045314650",
      "acc_seconds": 894
    },
    {
      "imei": "668683000215250",
      "acc_seconds": 65491302
    },
    {
      "imei": "668683000215260",
      "acc_seconds": 65491526
    }
  ]
}

JSONObject

如果实在spring-boot项目中,contorller层可以直接这么写:

	//直接用JSONObject 接收请求(一般不建议这么写,经常会进行属性的检查,这么写不方便,也不利于后续维护)
    @RequestMapping("testJSONObject")
    public void testJSONObject(@RequestBody JSONObject jsonObject) {
        log.info("jsonObject = {} ", jsonObject);
    }

看看Demo吧:

 public static void main(String[] args) {
        String str = "{\n" +
                "  \"ret\": 0,\n" +
                "  \"msg\": \"OK\",\n" +
                "  \"code_msg\": \"OK!\",\n" +
                "  \"data\": [\n" +
                "    {\n" +
                "      \"imei\": \"862459047225011\",\n" +
                "      \"acc_seconds\": 5905\n" +
                "    },\n" +
                "    {\n" +
                "      \"imei\": \"862459045314650\",\n" +
                "      \"acc_seconds\": 894\n" +
                "    },\n" +
                "    {\n" +
                "      \"imei\": \"668683000215250\",\n" +
                "      \"acc_seconds\": 65491302\n" +
                "    },\n" +
                "    {\n" +
                "      \"imei\": \"668683000215260\",\n" +
                "      \"acc_seconds\": 65491526\n" +
                "    }\n" +
                "  ]\n" +
                "}";
        JSONObject jsonObject = JSONObject.parseObject(str);
        JSONArray jsonArray = jsonObject.getJSONArray("data");
        log.info("JSONArray------");
        jsonArray.forEach(o ->{
            log.info("o = {}",o);
        });
	}

执行结果:

 JSONArray------
 o = {"acc_seconds":5905,"imei":"862459047225011"}
 o = {"acc_seconds":894,"imei":"862459045314650"}
 o = {"acc_seconds":65491302,"imei":"668683000215250"}
 o = {"acc_seconds":65491526,"imei":"668683000215260"}

JSONArray

在JSONObject的栗子中已经有了JSONArray,这里做一点点补充
1:JSONArray 本质上等于 ArrayList 也等于 List < Object >

	//JSONArray 本质上等于 ArrayList   也等于     List<Object>
        log.info("List<Object>------");
        List<Object> list = jsonObject.getJSONArray("data");
        list.forEach(o ->{
            log.info("o = {}",o);
        });

执行结果是一样的

List<Object>------
o = {"acc_seconds":5905,"imei":"862459047225011"}
o = {"acc_seconds":894,"imei":"862459045314650"}
o = {"acc_seconds":65491302,"imei":"668683000215250"}
o = {"acc_seconds":65491526,"imei":"668683000215260"}
看下源码

补充说明:JSONObject转对象时,自动实现蛇形转驼峰

可以看下数据格式中有:code_msg
现在创建一个对象,让这个请求转成对象

请求数据对应的对象

@Data
public class ResultModel<T> {
    private Integer ret;
    private String msg;
    private String codeMsg;
    private T data;
}

在main中加几行代码:
这里没有做其他操作,JSONObject自动将蛇形key 转成驼峰了。
和 JSON.parseObject(jsonStr,Model.class)是一样的。

    ResultModel resultModel = JSONObject.parseObject(jsonObject.toJSONString(),ResultModel.class);
	log.info("ret = {}",resultModel.getRet());
	log.info("code_msg ={}",resultModel.getCodeMsg());

执行结果:

 ret = 0
 code_msg =OK!

写在在最后的话:
此文记录的是工作中遇到的些许问题,有不足之处还望大家多多指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值