【问题标题】:Jackson detection of duplicate JSON POJO properties and Map keysJackson 检测重复的 JSON POJO 属性和 Map 键
【发布时间】:2014-05-21 11:15:41
【问题描述】:

我正在尝试捕获重复的 POJO 属性或 Map 键已传递给我的 WebService。

例如,如果field1 出现两次或映射键1 出现两次,我想抛出一个错误:

{
  "field1" : 1,
  "field1" : 2,
  "map" : {
    "1" : {
      "fieldA" : "null",
      "fieldB" : "2"
    },
    "1" : {
      "fieldX" : "null",
      "fieldY" : "2"
    }
  }
}

【问题讨论】:

    标签: json jackson


    【解决方案1】:

    可以使用JsonParser.Feature.STRICT_DUPLICATE_DETECTION

    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);
    MyPOJO result = mapper.readValue(json, MyPOJO.class);
    

    结果:

    com.fasterxml.jackson.core.JsonParseException: Duplicate field 'field1'
    

    How to use Jackson to validate duplicated properties?发布关于DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY的帖子

    【讨论】:

      【解决方案2】:

      看看这个讨论:http://jackson-users.ning.com/forum/topics/detecting-duplicate-field

      下面是一个 Map 类的示例代码:

      public class JacksonDuplicates {
      
          private static final String JSON = "{\n" +
                  "  \"field1\" : 1,\n" +
                  "  \"field1\" : 2,\n" +
                  "  \"map\" : {\n" +
                  "    \"1\" : {\n" +
                  "      \"fieldA\" : \"null\",\n" +
                  "      \"fieldB\" : \"2\"\n" +
                  "    },\n" +
                  "    \"1\" : {\n" +
                  "      \"fieldX\" : \"null\",\n" +
                  "      \"fieldY\" : \"2\"\n" +
                  "    }\n" +
                  "  }\n" +
                  "}";
      
          private static class SingleKeyHashMap<K, V> extends HashMap<K, V> {
              @Override
              public V put(K key, V value) {
                  if (containsKey(key)) {
                      throw new IllegalArgumentException("duplicate key " + key);
                  }
                  return super.put(key, value);
              }
          }
      
          public static void main(String[] args) throws IOException {
              SimpleModule module = new SimpleModule();
              module.addAbstractTypeMapping(Map.class, SingleKeyHashMap.class);
              ObjectMapper mapper = new ObjectMapper();
              mapper.registerModule(module);
      
              mapper.readValue(JSON, Map.class);
      
          }
      }
      

      输出:

      Exception in thread "main" java.lang.IllegalArgumentException: duplicate key field1
          at jackson.JacksonDuplicates$SingleKeyHashMap.put(JacksonDuplicates.java:38)
          at com.fasterxml.jackson.databind.deser.std.MapDeserializer._readAndBindStringMap(MapDeserializer.java:434)
          at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:312)
          at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:26)
          at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993)
          at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2098)
          at jackson.JacksonDuplicates.main(JacksonDuplicates.java:50)
      

      【讨论】:

      • 如何在 JAX-RS 应用程序中进行配置?
      • 根据您的用例,有几种方法可以实现这一点。例如,this wiki page 描述了如何为给定的 mime 类型配置对象映射器。
      • 我认为我找到了解决方案jackson-users.ning.com/forum/topics/…
      • 这在技术上是可行的,但它是一个 hack。 varren 的答案是“正确的”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 2012-11-04
      • 2021-08-27
      相关资源
      最近更新 更多