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