当前位置: 首页 > 知识库问答 >
问题:

(Java)使用Java8将JSONObject的JSONArray展平为[[]]

通安宁
2023-03-14

Im使用net.sf.json.JSONArray和net . SF . JSON . JSONObject . JSON array包含多个JSON object。

基本上是这样的:

[
    {
        "obj1": [
            {
                "ID": 12
                "NAME":"Whatever",
                "XY":[1,2]
            },
            {
                "ID": 34
                "NAME":"Again",
                "XY":[23,43]
            },
            etc
        ]
    },
    { "obj2": repeat}
]

我想用Java 8来解决这个问题,即结果:

[
    {
        "obj1": [
                    [12,'Whatever',1,2],
                    [34,'Again',23,43],
                    etc...
        ]
    },
    { "obj2": repeat}
]

共有2个答案

楚天宇
2023-03-14
JSONArray array = ...;
JSONArray flattedArray = flatten(array);

JSONObject map = ...;
JSONObject flattedMap = flatten(map);

当json结构发生变化时,实现发生了巨大的变化,您可以在github上比较我的提交历史。测试可以告诉你我是如何实现你的功能的。

public JSONArray flatten(Collection<?> array) {
    return array.stream().flatMap(this::flatting).collect(toJSONArray());
}

private Stream<?> flatting(Object it) {
    if (it instanceof Collection) {
        return ((Collection<?>) it).stream();
    }
    if (it instanceof Map) {
        return Stream.of(flatten((Map<?, ?>) it));
    }
    return Stream.of(it);
}

public JSONObject flatten(Map<?, ?> map) {
    return map.entrySet().stream().collect(
            JSONObject::new,
            (it, field) -> it.put(field.getKey(), flatten(field.getValue())),
            JSONObject::putAll
    );
}

private Object flatten(Object it) {
    if (it instanceof Collection) {
        return ((Collection<?>) it).stream().map(this::flatten)
                                            .collect(toJSONArray());
    }
    if (it instanceof Map) {
        return flatten(((Map<?, ?>) it).values());
    }
    return it;
}

private <T> Collector<T, ?, JSONArray> toJSONArray() {
    return toCollection(JSONArray::new);
}
裴焱
2023-03-14

尽管您可以使用/out递归以命令式方式轻松完成此操作,但以函数式风格实现可能更容易。我不确定我是否擅长Java8中的惯用函数代码,但您需要:

    < li >将项目收集到单个数组的收集器
static Collector<Object, JSONArray, JSONArray> toJSONArray() {
    return Collector.of(
            JSONArray::new,     // Create a new array
            JSONArray::add,     // Add each element to the target array
            (a1, a2) -> {       // Merge the second array into the first one
                a1.addAll(a2);
                return a1;
            },
            identity()          // Return the populated array itself
    );
}
  • 一个递归的flatten方法(灵感来自Stream.flatMap()的递归使用)。不确定它是否可以更容易地实现(Q43481457只是当前的类名)。
static Stream<?> flatten(final Object value) {
    return value instanceof Collection
            ? ((Collection<?>) value).stream().flatMap(Q43481457::flatten) // Flatten recursively
            : Stream.of(value);                                            // Otherwise wrap a single element into a stream
}
    < li >和主代码:
@SupressWarnings("unchecked")
final Collection<JSON> jsonArray = (Collection<JSON>) originalJsonArray;
final JSONArray flatJSONArray = jsonArray.stream()
        .map(json -> (Map<?, ?>) json)          // All outer array elements are JSON objects and maps in particular
        .map(jsonObject -> jsonObject.values()  // Recursively flatten the JSON object values
                .stream()
                .flatMap(Q43481457::flatten)
                .collect(toJSONArray())         // ... collecting them to JSON arrays
        )
        .collect(toJSONArray());                // ... which are collected to JSON arrays
System.out.println(flatJSONArray);

输出:

[[12,“无论如何”,1,2],[34,“再次”,23,43]]

 类似资料:
  • 本文向大家介绍JSONObject与JSONArray的使用,包括了JSONObject与JSONArray的使用的使用技巧和注意事项,需要的朋友参考一下 1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: 1.commons-lang.jar 2.commons-beanutils.jar 3.commons-collections.jar

  • 本文向大家介绍浅析Java中JSONObject和JSONArray使用,包括了浅析Java中JSONObject和JSONArray使用的使用技巧和注意事项,需要的朋友参考一下 废话不多说,先给大家贴代码,具体代码如下所示: 运行结果如下: 通过构造器的方式创建的JSONObject对象:{"derek":"23","dad":"49","mom":"45"} 通过fromObject方法将ma

  • 问题内容: 我今天在这个主题上搜索了很多。但是我找不到它,如何将JSONArray添加到JSONObject? 因为每次执行此操作都会收到此错误:Stackoverflow 我收到此错误: 我想要的JSON:只有最后一个JsonArray出问题了: ,“ vloer”:[{formaat:’vierkant10x15’tegels:[{naam:’‘,imgThumb:’/bla/bla.png’

  • 本文向大家介绍Java中JSONObject与JSONArray的使用区别详解,包括了Java中JSONObject与JSONArray的使用区别详解的使用技巧和注意事项,需要的朋友参考一下 最近公司开发的几个项目中,后台Action向前端传递数据都是Json格式,于是对JSONObject、JSONArray简单的研究了一下,废话不多说,想使用JSONObject、JSONArray,策则在项目

  • 问题内容: 基本上我有: 现在,我想将其转换为包含相同信息的。这样我就可以绕过对象,然后在需要时可以从对象中获取所有信息。任何帮助,将不胜感激,谢谢。 问题答案: 通常,Json对象将包含您的值(包括数组)作为其中的命名字段。因此,类似: 在JSON中将是{“ arrayName”:[…]}。

  • 我需要这样的输出JSON: 每个部分中的值将通过循环获得。我该如何形成这种JSON呢? 我有第一点: 但我不确定我需要做什么才能得到球员名单。 我正在使用Java-JSON库。