【问题标题】:How can i sort Nested JSON Array?如何对嵌套 JSON 数组进行排序?
【发布时间】:2012-06-20 22:51:51
【问题描述】:

如何对嵌套 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"
            }]
        }]
    }]
}

【问题讨论】:

    标签: java json multidimensional-array


    【解决方案1】:

    您的问题隐含了一些部分,不清楚您在哪里遇到问题:

    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 重载来避免将整个字符串读入内存。

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

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        将其反序列化为 POJO(使用 GsonJackson),并为这些 POJO 编写 Comparator

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-27
          • 1970-01-01
          • 1970-01-01
          • 2019-05-05
          • 1970-01-01
          • 2012-11-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多