如何对嵌套的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"
}]
}]
}]
}
答案 0 :(得分:1)
你的问题隐含了一些部分,而且你不清楚你遇到麻烦的地方:
不确定你遇到了哪些问题,所以这里有三个注意事项。
第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(使用Gson或Jackson),并为该POJO写一个Comparator。