1

我正在尝试在我的 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);
}

但不确定如何选择名称键进行排序。

4

2 回答 2

2

ORDER_MAP_ENTRIES_BY_KEYS是通过 Map 键启用 Map 排序的功能。由于您的结果类型不是 Map,因此不会应用此排序。要对数组进行排序,您可以创建自定义反序列化器或就地对反序列化数组进行排序。这个答案描述了如何实现这一点。

于 2021-04-28T08:13:41.143 回答
1

尝试这样的事情:

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

您可以逐步调试它,看看它是如何工作的。

于 2021-04-28T09:01:55.847 回答