多层嵌套json转换为Map再转换为单层
多层嵌套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再转换为单层相关推荐
- 迭代解决多层嵌套json 转map
最近工作需要用到json 转map ,在网上看到了一个方法,但并不能解决多层嵌套json,在此对这个方法进行了迭代处理,解决这个问题 import net.minidev.json.{JSONObje ...
- ASP.NET提取多层嵌套json数据的方法
ASP.NET提取多层嵌套json数据的方法 本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: ...
- java解析多层嵌套json字符串
java解析多层嵌套json字符串 java分别解析下面两个json字符串 package jansonDemo;import com.alibaba.fastjson.JSON; import co ...
- 多层嵌套json解析
多层嵌套json解析-- com.jayway.jsonpath.JsonPath public class FormDefineHelper {private FormDefineHelper() ...
- python 处理json多层嵌套_python解析多层嵌套json
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 这样多层json结构已完成. 补充拓展:python 读取多层嵌套的json数据 ...
- mysql获取多层嵌套json_提取多层嵌套Json数据
在.net 2.0中提取这样的json {"name":"lily","age":23,"addr":{"ci ...
- Python数据处理Tips多层嵌套Json数据展平到DataFrame
在工作中需要处理嵌套数据(尤其是无模式的 MongoDB 日志等)或者是网络爬虫抓取下来的多层嵌套数据需要展平处理. 如果将它放在 BigQuery 中则很容易通过使用 WITHIN 等的查询将其更改 ...
- 安卓取map集合转换为json_android json解析成map格式
"discount": { "3": "34", "4": "33", "5": ...
- Jackson - 将 JSON 字符串转换为 Map
① pom依赖: <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId&g ...
最新文章
- keras添加正则化全连接_收藏!改善TensorFlow模型的4种方法你需要了解的关键正则化技术(2)...
- java超级简单贪吃蛇_java实现简易贪吃蛇游戏
- SAP 销售与分销模块定价完全实施手册(SAP SD Pricing Handbook)
- Spark SQL JOIN操作代码示例
- helm部署hadoop并指定namespace和名称的命令
- vSphere5.0配置分布式交换机
- XSS跨站脚本(web应用)——XSS相关工具及使用(四)
- NVIDIA PhysX宣布正式开源 最强物理仿真引擎
- python学习笔记之property
- PHP GD压缩图片
- perl脚本中的特殊字符也与V字符串
- 精仿B站播放器外加弹幕库源码-带后台
- [项目分享]JSP+Servlet+JDBC+DBCP2实现在线购书系统
- 现金支票打印模板excel_WPS里面如何批量打印(WPS2019)
- 高级维修电工及技师技能实训考核装置QY-JSPX01
- 大数据项目实践 电影推荐系统概述(尚硅谷)
- c语言计算100天后是星期几,用C语言试编写一个程序,输入今天是星期几,计算并输出100天后是星期几....
- OpenGL缓冲区对象之FBO
- SpringBoot+JavaMailSender+ 腾讯企业邮箱配置
- kubectl的安装和配置
热门文章
- 苹果cms用宝塔定时采集+添加百度推送教程
- 架构三要素:职责明确的模块或者组件、关联关系、约束和指导原则
- compact php,如何使用php compact()函数
- java版 设计一个程序, 输入整数l, 求边长为l的正方形面积, 比直径为l的圆形面积大多少.
- 网络编程之编写LSP进行Winsock API监控拦截或LSP注入
- 关于python全局性解释锁(GIL)
- 机器学习笔记七——特征工程之特征处理
- 物体检测--HOG特征
- 2022年,短视频直播现状与发展趋势
- Python:环境变量设置PYTHONPATH解决impor导入模块报错