6

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

4

1 回答 1

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

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

于 2013-04-08T20:41:45.440 回答