多层嵌套json转换为Map再转换为单层

最近在实习的时候,需要将多层嵌套的json转换为单层的json。并且把json进行格式化。于是参照网上的网上的方法使用谷歌的gson利用递归的实现了多层json转换为单层的json。如

{"code":200, "message":"ok", "data":"{\"id\":131,\"appId\":6,\"versionCode\":6014000}"}

转换为:

{"code": 200,"data.appId": 6,"data.versionCode": 6014000,"data.id": 131,"message": "ok"
}

项目的github地址为: https://github.com/sweetcczhang/json2Map

使用gson中的JsonParser来做

/*** 使用Gson拍平json字符串,即当有多层json嵌套时,可以把多层的json拍平为一层* @param map* @param json* @param parentKey*/public static void parseJson2Map(Map map, String json, String parentKey){JsonElement jsonElement = new JsonParser().parse(json);if (jsonElement.isJsonObject()) {JsonObject jsonObject = jsonElement.getAsJsonObject();parseJson2Map(map,jsonObject,parentKey);//传入的还是一个json数组}else if (jsonElement.isJsonArray()){JsonArray jsonArray = jsonElement.getAsJsonArray();Iterator<JsonElement> iterator = jsonArray.iterator();while (iterator.hasNext()){parseJson2Map(map,iterator.next().getAsJsonObject(),parentKey);}}else if (jsonElement.isJsonPrimitive()){System.out.println("please check the json format!");}else if (jsonElement.isJsonNull()){}}public static void parseJson2Map(Map map,JsonObject jsonObject,String parentKey){for (Map.Entry<String, JsonElement> object : jsonObject.entrySet()) {String key = object.getKey();JsonElement value = object.getValue();String fullkey = (null == parentKey || parentKey.trim().equals("")) ? key : parentKey.trim() + "." + key;//判断对象的类型,如果是空类型则安装空类型处理if (value.isJsonNull()){map.put(fullkey,null);continue;//如果是JsonObject对象则递归处理}else if (value.isJsonObject()){parseJson2Map(map,value.getAsJsonObject(),fullkey);//如果是JsonArray数组则迭代,然后进行递归}else if (value.isJsonArray()){JsonArray jsonArray = value.getAsJsonArray();Iterator<JsonElement> iterator = jsonArray.iterator();while (iterator.hasNext()) {JsonElement jsonElement1 = iterator.next();parseJson2Map(map, jsonElement1.getAsJsonObject(), fullkey);}continue;// 如果是JsonPrimitive对象则获取当中的值,则还需要再次进行判断一下}else if (value.isJsonPrimitive()){try {JsonElement element = new JsonParser().parse(value.getAsString());if (element.isJsonNull()){map.put(fullkey,value.getAsString());}else if (element.isJsonObject()) {parseJson2Map(map, element.getAsJsonObject(), fullkey);} else if (element.isJsonPrimitive()) {JsonPrimitive jsonPrimitive = element.getAsJsonPrimitive();if (jsonPrimitive.isNumber()) {map.put(fullkey, jsonPrimitive.getAsNumber());} else {map.put(fullkey, jsonPrimitive.getAsString());}} else if (element.isJsonArray()) {JsonArray jsonArray = element.getAsJsonArray();Iterator<JsonElement> iterator = jsonArray.iterator();while (iterator.hasNext()) {parseJson2Map(map, iterator.next().getAsJsonObject(), fullkey);}}}catch (Exception e){map.put(fullkey,value.getAsString());}}}}

经过这个程序的处理,则会把json串转换为一个map对象。再把一个map对象转换为一个规格化的json串。

/***把拍平后的json进行格式化处理,输出标准的json格式* @param uglyJSONString* @return*/public static String jsonFormatter(String uglyJSONString){Map<String,Object> map = new HashMap<>();parseJson2Map(map,uglyJSONString,null);JSONObject jsonObject = JSONObject.fromObject(map);uglyJSONString = jsonObject.toString();Gson gson = new GsonBuilder().setPrettyPrinting().create();JsonParser jp = new JsonParser();JsonElement je = jp.parse(uglyJSONString);String prettyJsonString = gson.toJson(je);///System.out.println(prettyJsonString);return prettyJsonString;}

测试结果:

public static void main(String[] args){String json = "{\"code\":200, \"message\":\"ok\", \"data\":\"{\\\"id\\\":131,\\\"appId\\\":6,\\\"versionCode\\\":6014000}\"}";String test = "{" + "\"hello\": \"sweetzcc\"," +"\"topic\": \"gjs\"," +"\"Id\": \"180605Ceb8NB\"," +"\"Type\": \"REG\"," +"\"Time\": \"2018-06-05 10:02:24\"," +"\"sweetzcc\": \"{\\\"needUpdate\\\":true,\\\"Info\\\":\\\"{\\\\\\\"apple\\\\\\\":\\\\\\\"BB199DA64A7692E927722BFD1CA\\\\\\\",\\\\\\\"token\\\\\\\":null,\\\\\\\"uniqueId\\\\\\\":\\\\\\\"868387\\\\\\\",\\\\\\\"pushSweetToken\\\\\\\":\\\\\\\"a968\\\\\\\",\\\\\\\"device\\\\\\\":\\\\\\\"android\\\\\\\",\\\\\\\"systemName\\\\\\\":\\\\\\\"Re\\\\\\\",\\\\\\\"systemV\\\\\\\":\\\\\\\"7.0\\\\\\\",\\\\\\\"pVersion\\\\\\\":\\\\\\\"4.9\\\\\\\",\\\\\\\"key\\\\\\\":\\\\\\\"63e78ea58\\\\\\\",\\\\\\\"chan\\\\\\\":\\\\\\\"net\\\\\\\",\\\\\\\"push\\\\\\\":\\\\\\\"4\\\\\\\",\\\\\\\"userName\\\\\\\":null,\\\\\\\"product\\\\\\\":\\\\\\\"sweet\\\\\\\",\\\\\\\"crime\\\\\\\":1528,\\\\\\\"update1\\\\\\\":15281}\\\"}\"" +"}";String  array = "{'name':'111','child':[{'child':[{'name':'333'}]},{'name':'2221'}]}" ;System.out.println(jsonFormatter(test));}
{"sweetzcc.Info.pushSweetToken": "a968","sweetzcc.Info.systemName": "Re","sweetzcc.Info.device": "android","sweetzcc.Info.systemV": 7,"Time": "2018-06-05 10:02:24","sweetzcc.Info.chan": "net","sweetzcc.Info.product": "sweet","sweetzcc.Info.apple": "BB199DA64A7692E927722BFD1CA","Type": "REG","sweetzcc.Info.pVersion": 4.9,"topic": "gjs","sweetzcc.needUpdate": "true","sweetzcc.Info.uniqueId": 868387,"hello": "sweetzcc","Id": "180605Ceb8NB","sweetzcc.Info.update1": 15281,"sweetzcc.Info.push": 4,"sweetzcc.Info.key": "63e78ea58","sweetzcc.Info.crime": 1528
}
{"code": 200,"data.appId": 6,"data.versionCode": 6014000,"data.id": 131,"message": "ok"
}{"name": 111,"child.child.name": 333,"child.name": 2221
}

参考:

[]: https://blog.csdn.net/qq_24236769/article/details/77127318 “嵌套(任意层)JSON解析转换为Map”

多层嵌套json转换为Map再转换为单层相关推荐

  1. 迭代解决多层嵌套json 转map

    最近工作需要用到json 转map ,在网上看到了一个方法,但并不能解决多层嵌套json,在此对这个方法进行了迭代处理,解决这个问题 import net.minidev.json.{JSONObje ...

  2. ASP.NET提取多层嵌套json数据的方法

    ASP.NET提取多层嵌套json数据的方法 本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: ...

  3. java解析多层嵌套json字符串

    java解析多层嵌套json字符串 java分别解析下面两个json字符串 package jansonDemo;import com.alibaba.fastjson.JSON; import co ...

  4. 多层嵌套json解析

    多层嵌套json解析-- com.jayway.jsonpath.JsonPath public class FormDefineHelper {private FormDefineHelper() ...

  5. python 处理json多层嵌套_python解析多层嵌套json

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 这样多层json结构已完成. 补充拓展:python 读取多层嵌套的json数据 ...

  6. mysql获取多层嵌套json_提取多层嵌套Json数据

    在.net 2.0中提取这样的json {"name":"lily","age":23,"addr":{"ci ...

  7. Python数据处理Tips多层嵌套Json数据展平到DataFrame

    在工作中需要处理嵌套数据(尤其是无模式的 MongoDB 日志等)或者是网络爬虫抓取下来的多层嵌套数据需要展平处理. 如果将它放在 BigQuery 中则很容易通过使用 WITHIN 等的查询将其更改 ...

  8. 安卓取map集合转换为json_android json解析成map格式

    "discount": { "3": "34", "4": "33", "5": ...

  9. Jackson - 将 JSON 字符串转换为 Map

    ① pom依赖: <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId&g ...

最新文章

  1. keras添加正则化全连接_收藏!改善TensorFlow模型的4种方法你需要了解的关键正则化技术(2)...
  2. java超级简单贪吃蛇_java实现简易贪吃蛇游戏
  3. SAP 销售与分销模块定价完全实施手册(SAP SD Pricing Handbook)
  4. Spark SQL JOIN操作代码示例
  5. helm部署hadoop并指定namespace和名称的命令
  6. vSphere5.0配置分布式交换机
  7. XSS跨站脚本(web应用)——XSS相关工具及使用(四)
  8. NVIDIA PhysX宣布正式开源 最强物理仿真引擎
  9. python学习笔记之property
  10. PHP GD压缩图片
  11. perl脚本中的特殊字符也与V字符串
  12. 精仿B站播放器外加弹幕库源码-带后台
  13. [项目分享]JSP+Servlet+JDBC+DBCP2实现在线购书系统
  14. 现金支票打印模板excel_WPS里面如何批量打印(WPS2019)
  15. 高级维修电工及技师技能实训考核装置QY-JSPX01
  16. 大数据项目实践 电影推荐系统概述(尚硅谷)
  17. c语言计算100天后是星期几,用C语言试编写一个程序,输入今天是星期几,计算并输出100天后是星期几....
  18. OpenGL缓冲区对象之FBO
  19. SpringBoot+JavaMailSender+ 腾讯企业邮箱配置
  20. kubectl的安装和配置

热门文章

  1. 苹果cms用宝塔定时采集+添加百度推送教程
  2. 架构三要素:职责明确的模块或者组件、关联关系、约束和指导原则
  3. compact php,如何使用php compact()函数
  4. java版 设计一个程序, 输入整数l, 求边长为l的正方形面积, 比直径为l的圆形面积大多少.
  5. 网络编程之编写LSP进行Winsock API监控拦截或LSP注入
  6. 关于python全局性解释锁(GIL)
  7. 机器学习笔记七——特征工程之特征处理
  8. 物体检测--HOG特征
  9. 2022年,短视频直播现状与发展趋势
  10. Python:环境变量设置PYTHONPATH解决impor导入模块报错