如何对 JsonNode 数组列表进行排序
How to sort JsonNode array List
我正在尝试在我的 json 负载中对数组节点下方进行排序。应该按 name
元素排序
之前:
"empData": [
{
"name": "Jhon",
"age": 33
},
{
"name": "Sam",
"age": 24
},
{
"name": "Mike",
"age": 65
},
{
"name": "Jenny",
"age": 33
}
]
预计:
"empData": [
{
"name": "Jenny",
"age": 33
},
{
"name": "Jhon",
"age": 33
},
{
"name": "Mike",
"age": 65
},
{
"name": "Sam",
"age": 24
}
]
我正在尝试以下选项:
private static final ObjectMapper SORTED_MAPPER = new ObjectMapper();
static {
SORTED_MAPPER.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
}
public static JsonNode sortJsonArrayList(final JsonNode node) throws IOException {
final Object obj = SORTED_MAPPER.treeToValue(node, Object.class);
final String json = SORTED_MAPPER.writeValueAsString(obj);
return objectMapper.readTree(json);
}
但不确定如何select命名键进行排序。
ORDER_MAP_ENTRIES_BY_KEYS
是通过 Map 键启用 Map 排序的功能。由于您的结果类型不是地图,因此不会应用此排序。要对数组进行排序,您可以创建自定义反序列化器或就地对反序列化数组进行排序。 答案描述了如何实现。
尝试这样的事情:
public JsonNode some(JsonNode node){
//find list of objects that contains field name
List<JsonNode> dataNodes = node.findParents("name");
//sort it
List<JsonNode> sortedDataNodes = empDataNodes
.stream()
.sorted(Comparator.comparing(o -> o.get("name").asText()))
.collect(Collectors.toList());
//return the same Json structure as in method parameter
ArrayNode arrayNode = objectMapper.createObjectNode().arrayNode().addAll(sortedEmpDataNodes);
return objectMapper.createObjectNode().set("empData", arrayNode);
}
大家可以一步步调试,看看效果如何。
我正在尝试在我的 json 负载中对数组节点下方进行排序。应该按 name
元素排序
之前:
"empData": [
{
"name": "Jhon",
"age": 33
},
{
"name": "Sam",
"age": 24
},
{
"name": "Mike",
"age": 65
},
{
"name": "Jenny",
"age": 33
}
]
预计:
"empData": [
{
"name": "Jenny",
"age": 33
},
{
"name": "Jhon",
"age": 33
},
{
"name": "Mike",
"age": 65
},
{
"name": "Sam",
"age": 24
}
]
我正在尝试以下选项:
private static final ObjectMapper SORTED_MAPPER = new ObjectMapper();
static {
SORTED_MAPPER.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
}
public static JsonNode sortJsonArrayList(final JsonNode node) throws IOException {
final Object obj = SORTED_MAPPER.treeToValue(node, Object.class);
final String json = SORTED_MAPPER.writeValueAsString(obj);
return objectMapper.readTree(json);
}
但不确定如何select命名键进行排序。
ORDER_MAP_ENTRIES_BY_KEYS
是通过 Map 键启用 Map 排序的功能。由于您的结果类型不是地图,因此不会应用此排序。要对数组进行排序,您可以创建自定义反序列化器或就地对反序列化数组进行排序。
尝试这样的事情:
public JsonNode some(JsonNode node){
//find list of objects that contains field name
List<JsonNode> dataNodes = node.findParents("name");
//sort it
List<JsonNode> sortedDataNodes = empDataNodes
.stream()
.sorted(Comparator.comparing(o -> o.get("name").asText()))
.collect(Collectors.toList());
//return the same Json structure as in method parameter
ArrayNode arrayNode = objectMapper.createObjectNode().arrayNode().addAll(sortedEmpDataNodes);
return objectMapper.createObjectNode().set("empData", arrayNode);
}
大家可以一步步调试,看看效果如何。