[英]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部分:获取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(使用Gson或Jackson ),然后为该POJO写一个Comparator 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.