【问题标题】:Jackson JsonNode to string with sorted keys杰克逊 JsonNode 到带有排序键的字符串
【发布时间】:2013-09-23 05:55:02
【问题描述】:

我正在使用Jackson 2.2.3,需要将 JsonNode 树转换为带有排序字段键的字符串。我完全不清楚如何做到这一点,特别是因为相反的事情是如此简单 - JsonNode jn = ObjectMapper.readTree(String s)

看来正确的方法是void writeTree(JsonGenerator jgen,JsonNode rootNode)。但是,我认为没有办法从JsonGenerator 获取序列化的String。我认为SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS 仍然适用,因为JsonGenerator.Features 没有该选项。有没有更简单的方法来做到这一点 - 如果没有,我如何从 JsonGenerator 检索序列化字符串?

【问题讨论】:

    标签: java sorting jackson


    【解决方案1】:

    这是杰克逊的一位作者提供的最简单的方法。目前无法使用排序键直接从JsonNodeString

    private static final ObjectMapper SORTED_MAPPER = new ObjectMapper();
    static {
        SORTED_MAPPER.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
    }
    
    private String convertNode(final JsonNode node) throws JsonProcessingException {
        final Object obj = SORTED_MAPPER.treeToValue(node, Object.class);
        final String json = SORTED_MAPPER.writeValueAsString(obj);
        return json;
    }
    

    【讨论】:

    • 有没有办法对 JSON 中的数组进行排序?如果您有 json 数组,则此解决方案不起作用:{id:1, collection:[z, y]} 序列化后如果 bacame {collection:[z, y], id:1} 所以 collection 中的项目根本没有订购! :(
    • @Cherry 在序列化之前正常对数组进行排序。 Jackson 需要对地图进行排序的原因是因为地图没有内在的排序。数组可以,因此应用程序可以在序列化为 JSON 之前根据需要对数组进行排序。这对于地图是不可能的(通常)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    相关资源
    最近更新 更多