Jackson解析器处理具有相同名称的多个域名

时间:2013-04-08 19:46:05

标签: json jackson

我认为Jackson JSON解析器的一个功能是我案例的固有问题。 我将解析一个可能不符合json格式的未知文件,从而最终得到多个相同的键名。在这种情况下,如果我在其上调用类似getFieldNames()的函数,它最终只在这些多个相同的简单元素中给出一个条目。 因此,如果我对它执行get(String),我最终只会获得其中一个具有相同键值的Json节点,而我应该得到所有其他节点 对此有何评论或解决方案?

1 个答案:

答案 0 :(得分:4)

大多数JSON解析器都会拒绝您的输入文件,因为不允许在相同嵌套级别使用重复键(这是事实上的标准)。但是,某些解析器将允许您以各种方式处理副本。

在Jackson中处理此问题的一种方法是将常规属性映射到实体类,然后通过@JsonAnySetter处理潜在的重复项。

public class Bag {
    final transient Multimap<String, Object> multimap = LinkedListMultimap
            .create();

    // regular properties, constructors etc

    @JsonAnySetter
    public void add(final String key, final String value) {
        multimap.put(key, value);
    }
}

请注意使用multimap:常规哈希映射不能包含重复键,因此multimap是工作解决方案的必要条件。反序列化输入文件后,所有“常规”JSON属性将映射到其对应的实体属性,而所有重复项将存储在地图中,并可用于手动处理。

final List<Object> duplicatedValues = multimap.get(someKey);

或者,您可以创建一个自定义反序列化器,接收所有令牌(无论它们是否重复)。