多层嵌套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. 用ASP.NET上传大文件
  2. 关于文献中二代测序数据下载(NCBI)的问题
  3. 相同命名空间相同类名的程序集间引发的致命错误
  4. 八.使用OpenCv图像平滑操作
  5. IDEA中如何设置方法注释格式
  6. IE通过推理IE陈述的版本号
  7. 使用springboot集成jseesite
  8. java ssh cpu_初学Java ssh之Spring 第四篇
  9. 【HTML 初学】2、HTML属性
  10. 解决vscode中Module ‘torch‘ has no ‘xxx‘ member的烦人错误
  11. 【文献阅读】2004 Goktekin NS方程加弹性 A Method for Animating Viscoelastic Fluids
  12. 阵列matlab程序,阵列信号处理的理论和应用 原书matlab 程序.rar
  13. 【软件】3DsMax2009 下载百度云盘下载(附教程)
  14. 即时通讯之xmpp协议简析
  15. GPS 经纬度换算方法和定位误差计算
  16. 浙江农林大学计算机分数线,浙江农林大学各专业录取分数线
  17. SDIO_WiFi驱动学习之安卓WLAN架构介绍及调用流程分析
  18. NetToPlcSim_PLC_西门子PLC访问DEMO
  19. 风云编程python基础语法(5)
  20. 机器学习笔记 --- 数学符号以及读法

热门文章

  1. compact mysql_mysql中compact行的存储结构
  2. android 下载txt文件恢复,牛学长安卓数据恢复(UltData - Android)
  3. shopee一件代发怎么算运费?计算方式是什么?
  4. 制作maven-archeType
  5. R和R-Studio安装
  6. 计算机应用方向的毕业设计,计算机应用(动画方向)毕业设计.pdf
  7. 【转载】三国演义里将领的身高
  8. Android中比较好的开源项目整理
  9. 谷歌突然宣布:上帝的密码防线逐渐崩溃!人工智能有可能是人类文明史的终结!...
  10. Android 源码 输入系统之 InputReader