当前位置: 首页 > 面试题库 >

如何使用Jackson验证重复属性?

许奇
2023-03-14
问题内容

我正在使用Jackson JSON库将一些JSON对象转换为POJO类。问题是,当我使用具有重复属性的JSON对象时,例如:

{
  "name":"xiaopang",
  "email":"xiaopang1@123.com",
  "email":"xiaopang2@123.com"
}

杰克逊报告最后一封电子邮件对"email":"xiaopang2@123.com",然后解析该对象。

我从JSON语法中获悉了对象中的重复键吗?反序列化具有重复属性的JSON对象时发生的情况取决于库的实现,是抛出错误还是将最后一个用于重复键。

尽管跟踪所有属性会产生开销,但是在这种情况下,是否有任何方法可以告诉Jackson报错或异常,例如“ Duplicate key”?


问题答案:

JsonParser.Feature.STRICT_DUPLICATE_DETECTION

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

结果是:

Exception in thread "main" com.fasterxml.jackson.core.JsonParseException: Duplicate field 'email'

您也可以尝试使用DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY(更多信息)如果先将json字符串/输入反序列化为jackson
json树,然后反序列化为POJO,则会触发该问题。可以将其与自定义结合起来,JsonDeserializer如下所示:

private static class MyPojoDeserializer extends JsonDeserializer<MyPOJO>{

    @Override
    public MyPOJO deserialize(JsonParser p, DeserializationContext ctxt) 
                                                           throws IOException{
        JsonNode tree = p.readValueAsTree();
        return  p.getCodec().treeToValue(tree, MyPOJO.class);
    }
}

设置一次,并使用与以前相同的方式:

// setup ObjectMapper 
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
SimpleModule module = new SimpleModule();
module.addDeserializer(MyPOJO.class,new MyPojoDeserializer() );
mapper.registerModule(module);

// use
mapper.readValue(json, MyPOJO.class);

结果:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Duplicate field 'email' for ObjectNode: not allowed when FAIL_ON_READING_DUP_TREE_KEY enabled

其他选择是自己在自定义反序列化器中或在POJO setter方法中实现所有逻辑。



 类似资料:
  • 问题内容: 我正在尝试使用Jackson JSON接受一个字符串,并确定它是否为有效JSON。谁能建议要使用的代码示例(Java)? 问题答案: 不知道您的用例是什么,但是应该这样做:

  • 我正在制作一个基于文本的冒险游戏,我需要进行一些用户输入验证 我已经为这个特定实例设置了循环,但在输入正确的输入后,我似乎无法使循环中断。 代码: 我的输出是这样的: 你的选择是敲打还是猛击。别那么粗鲁。 大满贯 你猛地撞上沉重的橡木门,沉重的铁铰链砰的一声让位了。当你凝视城堡的第一个房间时,灰尘落在你的头上。大厅大约有五十英尺长。西墙有三扇门,东墙有两扇门。空气中弥漫着霉菌、湿气和铁的味道。曾经

  • 假设我有以下课程: 是否可以通过“MyProduct”类验证“code”属性?比如:

  • 我想验证具有字符串属性和字符串值的元素: 我使用了: 它说内容无效。 文档中说,具有属性的元素总是“complexType”。如果省略xs:restriction行,则内容必须为空。但我想要一个字符串值(“eric”)。 XSD代码应该是什么? 附言:我想避免丑陋的“mixed=“true”

  • 如果我上传了.xls或任何其他文件,那么它将显示一个错误。

  • 晚上好,我正在尝试在下面的场景中使用Hibernate验证器: