繁体   English   中英

如何排序嵌套JSON数组?

[英]How can i sort Nested JSON Array?

如何排序嵌套JSON数组? 就像下面的JSON ...

{
    "id":"rtmc05.lax.someabc.net",
    "name":"rtmc05.lax.someabc.net",

    "tenants":[{
        "id":"rtmc",
        "name":"rtmc"
    },{
        "id":"hrs",
        "name":"hrs"
    },{
        "id":"amotelbe1",
        "name":"amotelbe"
    },{
        "id":"cds",
        "name":"cds"
    },{
        "id":"idx-server",
        "name":"idx-server",

        "tenants":[{
            "id":"amotelbe",
            "name":"amotelbe",

            "tenants":[{
                "id":"amotelui",
                "name":"amotelui"
            }]
        }]
    }]
}

您的问题隐含了一些内容,尚不清楚您在哪里遇到麻烦:

  1. 如何获取JSON字符串并从中使用可用的Java对象。 (我假设使用Java,而不是JavaScript,因为您已经用“ java”标记了问题。)
  2. 制作完这些物品后如何排序?
  3. 您如何处理对嵌套零件的排序? (在您的示例中,“ idx-server”具有子租户。)

不确定到底遇到了什么问题,所以这里是所有这三个方面的注意事项。

第1部分:获取Java对象

我同意另一个人的观点,即Jackson是一个很好的JSON解析器。 这是几行代码,可用于解析一些JSON:

String jsonString = "..."; // Load this in whatever way makes sense for you
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> parsedJson = mapper.readValue(jsonString, Map.class);

如果您的JSON字符串确实很大,则可以使用其他readValue重载来避免将整个String读入内存。

第2部分:对Java对象进行排序

一旦获得了解析的JSON,排序就只需调用Collections.sort(...) ,并传递tenants数组即可。 另外,您需要编写一个Comparator来定义所需的顺序。 例如,这是一个按名称排序的比较器:

public class NameComparator implements Comparator<Map<String,Object>> {
    public int compare(Map<String,Object> o1, Map<String,Object> o2) {
        String name1 = (String) o1.get("name");
        String name2 = (String) o2.get("name");
        return name1.compareTo(name2);
    }
}

然后,将租户数组取出(Jackson使它们成为ArrayList对象)并调用Collections.sort(...) 例如,

List<Map<String,Object>> tenants =
        (List<Map<String,Object>>) parsedJson.get("tenants");
Collections.sort(tenants, new NameComparator());

第3部分:处理嵌套

最简单的方法是添加一些额外的代码来遍历JSON,以查找具有租户数组的任何对象并将其排序。 例如,这是应该执行的递归函数:

public static void recursiveSortTenants(Map<String,Object> jsonObject) {
    List<Map<String,Object>> tenants =
            (List<Map<String,Object>>) jsonObject.get("tenants");
    if (tenants != null) {
        Collections.sort(tenants, new NameComparator());
        // For each tenant, see if it has sub-tenants.  If so,
        // call this function again to sort them.
        for (Map<String,Object> tenant : tenants) {
            if (tenants.containsKey("tenants")) {
                recursiveSortTenants(tenant);
            }
        }
    }
}

希望这可以帮助!

将其解析为(javascript)对象,然后编写一个sort函数,以对此类JavaScript对象的数组进行排序。

将其反序列化为 POJO(使用GsonJackson ),然后为该POJO写一个Comparator

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM