愉快的(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); } } }运行程序,可得: 同样成功!!!