3

我正在尝试编写一个简单的类,该类将验证 JSON 输入字符串是否可以转换为目标JAVA对象。如果在输入 JSON 字符串中发现任何未知字段,验证器应该会失败。这一切都按预期工作,除非我用 注释 A 类中的 B 对象 @JsonUnwrapped,然后对象映射器将默默地忽略未知属性而不会失败。

这是我的代码:

甲类:

public class A implements Serializable{


protected String id;
protected String name;


protected @JsonUnwrapped B b;

public A(){

}
public A(String id, String name, B b) {
    super();
    this.id = id;
    this.name = name;
    this.b = b;
}

     //GETTERS/SETTERS

}

B类:

  public class B {


protected String innerId;
protected String innerName;

public B(){

}
public B(String innerId, String innerName) {
    super();
    this.innerId = innerId;
    this.innerName= innerName;
}
    //GETTERS/SETTERS
 }

验证器类:

 public class JsonValidator{
         public boolean validate(){

             ObjectMapper mapper = new ObjectMapper();

        //mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);

        try {
                mapper.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        A a = mapper.readValue(
                          JsonValidatorBean.class.getResourceAsStream("sample.json"),
                          A.class);
                 } catch (JsonParseException e) {
            e.printStackTrace();
         } catch (JsonMappingException e) {
                e.printStackTrace();
         } catch (IOException e) {
               e.printStackTrace();
         }

}

要验证的 JSON:

{
   "id": "aaaa",
   "naome": "aaa",    
   "innerId" : "bbbb",
   "innerName" : "bbb"

}

我正在使用 Jackson 2.1 我希望这段代码在未知属性“ naome ”上失败,但它不会被忽略。如果我删除@JsonUnwrapped并将 Json 调整为具有嵌入式对象,则上述代码将按预期失败。

有任何想法吗?

4

1 回答 1

3

是的,这是真实的陈述。由于从父上下文传递展开的属性所需的逻辑,没有办法有效地验证哪些属性可以合法地映射到子 POJO(那些被展开的),哪些不是。

有一个 RFE 试图改进事物,捕获不可映射的属性,但当前版本(直到并包括 2.2)不能同时进行解包和防范不可映射的属性。

于 2013-04-16T19:08:03.207 回答