我如何对嵌套的JSON数组进行排序?

时间:2012-06-20 14:15:01

标签: java json multidimensional-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"
            }]
        }]
    }]
}

3 个答案:

答案 0 :(得分:1)

你的问题隐含了一些部分,而且你不清楚你遇到麻烦的地方:

  1. 如何获取JSON字符串并从中生成可用的Java对象。 (我假设是Java,而不是JavaScript,因为你用“java”标记了你的问题。)
  2. 如何在制作这些物品后对它们进行排序?
  3. 如何处理嵌套部件的排序? (在您的示例中,“idx-server”具有子租户。)
  4. 不确定你遇到了哪些问题,所以这里有三个注意事项。

    第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);
        }
    }
    

    然后你将租户阵列拿出来(杰克逊将它们变成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);
                }
            }
        }
    }
    

    希望这有帮助!

答案 1 :(得分:0)

将其解析为(javascript)对象,然后编写一个排序函数,对这类javascript对象进行排序。

答案 2 :(得分:0)

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