它们三个我就不一一介绍了,相信大家都已经有所了解,我就记录下我在工作中遇到的一个问题。

通常情况下,我工作中解析json字符串我会使用JSON去处理,类似这样:

CLass class = JSON.parseObject("字符串",Class.class);//字符串转化为指定对象
String str = JSON.toJSONString(Object);//对象转化为字符串

直到有一天,上游系统给我发了这样一段字符串:

{
    "stud": [
        {
            "name": "张三",
            "age": "10"
        },
        {}
    ]
}

说实话,我当时就蒙了,为啥蒙呢?

首先第一行是大括号,说明这是一个JSON类型的字符串,不是JSONArray类型的,因为JSONArray类型的字符串最外层是中括号。 类似这样:

[
        {
            "name": "张三",
            "age": "10"
        },
        {}
    ]

但是,作为JSON字符串,里面又是个循环,很容易发现,这个字符串数据最外层缺少了一层,这样的数据让我百思不得其解,想不明白这是如何转化的。

直到我看到了JSONObject,这玩意儿好啊,好在哪呢?它里面可以存放key-value类型的数据。

结果呼之欲出,上游系统生成的字符串数据是这么来的:

Stud stud = new Stud();//学生类,里面有name 和 age 两个属性
stud.setname("张三");
stud.setage(10);

JSONObject jsonObject = new JSONObject();//新建JSONObject对象
JSONArray jsonArray = new JSONArray();//JSONArray

jsonArray.add(stud);//把学生对象放进jsonArray中,注意这里可以循环新建stud对象并放入

jsonObject.put("stud",jsonArray);//把JSONArray以kye-value的形式放入到JSONObject中。
String sendStr = jsonObject.toJSONString();//最后转化成json字符串传递给我

到这里相信大家已经看懂了,那我作为下游接收方如何解析这个字符串呢?

//把接收到的字符串处理为JSONObject对象
JSONObject jsonstr = JSONObject.parseObject(sendStr);
JSONArray jsonArray = (JSONArray) jsonstr.get("stud");//使用get()获取JSONArray对象
int size = studArray.size();//获取JSONArray对象的大小
//接下来循环处理获取到的对象数据就可以了

好好好,真不知道如何循环是吧?那我再写点儿

for (int i=0;i<jsonArray.size();i++){//这里建议用i循环,因为要有一个类型转化
	Map<String,String> map = (Map) jsonArray.get(i);//这样就可以获取到对象了。
}
end