前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何利用java8的Stream,把jsonobject变成有层级关系的数据结构

如何利用java8的Stream,把jsonobject变成有层级关系的数据结构

作者头像
用户1289394
发布2023-08-22 16:17:54
发布2023-08-22 16:17:54
59200
代码可运行
举报
文章被收录于专栏:Java学习网Java学习网
运行总次数:0
代码可运行

使用Java 8的Stream API来将JSONObject转换为具有层次结构的数据结构,需要经过以下步骤:

1. 将JSONObject中的每个键值对转换为Map结构。

2. 遍历所有的Map,找到其中所有的嵌套JSONObject,并将其转换为Map结构。

3. 根据每个Map中的key进行分组,创建具有层级关系的Map。

下面是具体实现代码:

代码语言:javascript
代码运行次数:0
运行
复制


import org.json.JSONArray;

import org.json.JSONObject;

import java.util.*;

import java.util.function.Function;

import java.util.stream.Collectors;

public class JsonUtil {

/**

* 将JSONObject转换为具有层级关系的Map

*

* @param json JSONObject对象

* @return 具有层级关系的Map

*/

public static Map<String, Object> parseJsonObject(JSONObject json) {

Map<String, Object> map = toMap(json);

return groupByKey(map);

}

/**

* 将JSONObject转换为Map

*

* @param json JSONObject对象

* @return Map

*/

private static Map<String, Object> toMap(JSONObject json) {

return json.toMap().entrySet()

.stream()

.collect(Collectors.toMap(

Map.Entry::getKey,

entry -> {

Object value = entry.getValue();

if (value instanceof JSONObject) {

return toMap((JSONObject) value);

} else if (value instanceof JSONArray) {

return toList((JSONArray) value);

} else {

return value;

}

}));

}

/**

* 将JSONArray转换为List

*

* @param array JSONArray对象

* @return List

*/

private static List<Object> toList(JSONArray array) {

return array.toList().stream()

.map(value -> {

if (value instanceof JSONObject) {

return toMap((JSONObject) value);

} else if (value instanceof JSONArray) {

return toList((JSONArray) value);

} else {

return value;

}

})

.collect(Collectors.toList());

}

/**

* 根据Map中的key进行分组,创建具有层级关系的Map

*

* @param map Map对象

* @return 具有层级关系的Map

*/

private static Map<String, Object> groupByKey(Map<String, Object> map) {

Map<String, List<Map.Entry<String, Object>>> group = map.entrySet()

.stream()

.collect(Collectors.groupingBy(entry -> entry.getKey().split("\\.")[0]));

return group.entrySet()

.stream()

.collect(Collectors.toMap(

Map.Entry::getKey,

entry -> {

List<Map.Entry<String, Object>> list = entry.getValue();

if (list.size() == 1) {

return list.get(0).getValue();

} else {

Map<String, Object> childMap = list.stream()

.collect(Collectors.toMap(

e -> e.getKey().replace(entry.getKey() + ".", ""),

Map.Entry::getValue));

return groupByKey(childMap);

}

}));

}

}

使用示例:

假设我们有一个如下的JSONObject对象:

代码语言:javascript
代码运行次数:0
运行
复制


JSONObject jsonObject = new JSONObject();

jsonObject.put("name", "A");

jsonObject.put("age", 18);

jsonObject.put("address.country", "China");

jsonObject.put("address.city", "Beijing");

jsonObject.put("contacts.email", "a@example.com");

jsonObject.put("contacts.phone", "10086");

将它转换为具有层级关系的数据结构,可以这样使用:

代码语言:javascript
代码运行次数:0
运行
复制


Map<String, Object> map = JsonUtil.parseJsonObject(json);

System.out.println(map);

输出结果:

代码语言:javascript
代码运行次数:0
运行
复制


{

name=A,

age=18,

address={

country=China,

city=Beijing

},

contacts={

email=a@example.com,

phone=10086

}

}

可以看到,JSONObject已经被成功地转换为了具有层级关系的数据结构。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档