2013-04-08 45 views
5

我看到杰克逊JSON解析器的一个功能,作为我的案例的固有问题。 我要解析一个未知的文件,它可能不符合json格式,因此最终会有多个相同的键名。在这种情况下,如果我调用getFieldNames()之类的函数,它最终只会在这些多个相同的简单元素中给出一个条目。 所以如果我对它做一个get(String),那么我最终只会得到具有相同键值的Json节点中的一个,因为我应该得到所有其他的节点 对此有何评论或解决方案?杰克逊解析器处理同名域名的多字段名称

回答

4

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

在杰克逊处理此问题的一种方法是将常规属性映射到实体类中,然后通过@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); 
    } 
} 

注意使用多重映射:普通的哈希映射不能包含重复键,所以多重映射是一个可行的解决方案的要求。反序列化输入文件后,所有'常规'JSON属性将映射到其相应的实体属性,而所有重复项将存储在映射中,并可用于手动处理。

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

或者,您可以创建一个自定义解串器,其收到的所有令牌(无论它们是否是重复的或没有)。

+0

如果我想让反序列化器在发现重复属性时发出错误,该怎么办? – 2rs2ts 2015-01-23 19:07:00

+0

@ 2rs2ts - 抛出重复错误的错误是解串器的默认行为。如果这就是你想要发生的事情,那么你不需要这个答案中的解决方案。 – Perception 2015-01-29 15:51:33

+0

谢谢。我对我的JSON在我的代码中经历了哪种反序列化器感到困惑,所以我猜我认为这不是默认行为是错误的:)但无论如何,这很好。 – 2rs2ts 2015-01-29 19:21:54