如何对 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);
}

大家可以一步步调试,看看效果如何。