前言
愉快的(3+7=8的)中秋国庆假期已经接近尾声,特此写篇博客聊以记录学习过程尽早进入学习状态,也便不陷入假期综合征,使得工作免于痛苦。
缘由
关于如何使用Fastjson进行JSON解析可以查看我的这篇博客:史上最全的JSON解析之Fastjson
之前在工作过程中遇到的如下所示格式的JSON对象需要进行遍历处理:
{
"王者荣耀" : {
"韩信" : "001",
"猪八戒" : "002",
"伽罗" : "003"
},
"西游记" : {
"孙悟空" : "001",
"唐僧" : "002",
"沙悟净" : "003"
}
}
对于对JSON解析仍处于狭小认知的我来说,遇到JSON解析遍历第一时间便不假思索的果断转换成JSON数组,然后进行遍历呀!于是刷刷刷,开始编码,模拟如下:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
* @ClassName Test
* @Description json字符串处理
* @Author 古阙月
* @Date 2020/10/7 11:04
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
String jsonString = "{\n" +
"\t\"王者荣耀\" : {\n" +
"\t\t\"韩信\" : \"001\",\n" +
"\t\t\"猪八戒\" : \"002\",\n" +
"\t\t\"伽罗\" : \"003\"\n" +
"\t},\n" +
"\t\"西游记\" : {\n" +
"\t\t\"孙悟空\" : \"001\",\n" +
"\t\t\"唐僧\" : \"002\",\n" +
"\t\t\"沙悟净\" : \"003\"\n" +
"\t}\n" +
"}";
// 根据JSON字符串得到JSON数组
JSONArray jsonArray = JSON.parseArray(jsonString);
// 遍历JSON数组
for (int i = 0; i < jsonArray.size(); i++) {
// 根据JSON数组的索引获得JSON对象
JSONObject jsonObject = (JSONObject) jsonArray.get(i);
// 输出JSON对象
System.out.println(jsonObject);
}
}
}
结果一输出,傻眼了:
但其实想想也对,毕竟JSON数组是这种格式:
[{"key1":"value1", "key2":"value2"...}, {"key1":"value1", "key2":"value3"...}...]
而需要处理的数据格式很明显是纯粹的key - value
,也就是这种格式:
{"key1" : {"key1":"value1", "key2":"value2"...}, "key2" : {"key1":"value1", "key2":"value3"...}...}
转换
其实我们将需要解析的数据格式转换成Java的数据类型就很好理解了:
JSON数组 -> List<Object>:
[{"key1":"value1", "key2":"value2"...}, {"key1":"value1", "key2":"value3"...}...]
JSON数组对应着Java里面的List集合,所以也就不难理解JSON数组能够直接遍历获取数据了。
而我们上文中需要解析的数据格式:
{"key1" : {"key1":"value1", "key2":"value2"...}, "key2" : {"key1":"value1", "key2":"value3"...}...}
对应着Java中的Map<String, Map<String, String>>类型,或者说是Map<String, Map<String, Object>>类型。
好家伙,那我们直接把JSON字符串转换成相应的对象就好了
/**
* @ClassName JSONObjectTest
* @Description json字符串处理
* @Author 古阙月
* @Date 2020/9/21 14:01
* @Version 1.0
*/
public class JSONObjectTest {
public static void main(String[] args) {
String jsonString = "{\n" +
"\t\"王者荣耀\" : {\n" +
"\t\t\"韩信\" : \"001\",\n" +
"\t\t\"猪八戒\" : \"002\",\n" +
"\t\t\"伽罗\" : \"003\"\n" +
"\t},\n" +
"\t\"西游记\" : {\n" +
"\t\t\"孙悟空\" : \"001\",\n" +
"\t\t\"唐僧\" : \"002\",\n" +
"\t\t\"沙悟净\" : \"003\"\n" +
"\t}\n" +
"}";
// 将整个json对象转换成一个大map
HashMap<String, Map<String, Object>> bigMap = JSON.parseObject(jsonString, HashMap.class);
// 遍历大map
for (Object key : bigMap.keySet()) {
// 输出大map的key
System.out.println(key);
// 通过大map的key,得到一个个小map
Map<String, Object> smallMap = (Map<String, Object>) bigMap.get(key);
System.out.println(smallMap);
}
}
}
运行程序,遍历成功:
蹊径
但既然JSON数组无需转换成List集合再进行遍历。那么,同理我也不需要转换成Map对象即可遍历:
/**
* @ClassName JSONObjectTest
* @Description json字符串处理
* @Author 古阙月
* @Date 2020/9/21 14:01
* @Version 1.0
*/
public class JSONObjectTest2 {
public static void main(String[] args) {
String jsonString = "{\n" +
"\t\"王者荣耀\" : {\n" +
"\t\t\"韩信\" : \"001\",\n" +
"\t\t\"猪八戒\" : \"002\",\n" +
"\t\t\"伽罗\" : \"003\"\n" +
"\t},\n" +
"\t\"西游记\" : {\n" +
"\t\t\"孙悟空\" : \"001\",\n" +
"\t\t\"唐僧\" : \"002\",\n" +
"\t\t\"沙悟净\" : \"003\"\n" +
"\t}\n" +
"}";
// 将整个json字符串转换成一个JSON对象
JSONObject bigJSON = JSON.parseObject(jsonString);
// 遍历JSON对象
for (Object key : bigJSON.keySet()) {
// 输出JSON对象的key
System.out.println(key);
// 通过JSON对象的key,得到一个个小json
JSONObject smallJsonObject = (JSONObject) bigJSON.get(key);
System.out.println(smallJsonObject);
}
}
}
运行程序,可得:
同样成功!!!