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

2023-08-22 16:17:54 浏览数 (1)

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

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

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

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

下面是具体实现代码:

代码语言:javascript复制


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复制


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复制


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

System.out.println(map);

输出结果:

代码语言:javascript复制


{

name=A,

age=18,

address={

country=China,

city=Beijing

},

contacts={

email=a@example.com,

phone=10086

}

}

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

0 人点赞