2013-08-29 39 views
1

从教程中,我有印象,这应该工作(例如简化):杰克逊反序列化:无法识别领域

public class Foo { 
    private String bar; 
    public String getBar() { 
     return bar; 
    } 
    public void setBar(String bar) { 
     this.bar = bar; 
    } 
    public static class Qux { 
     private String foobar; 
     public String getFoobar() { 
      return foobar; 
     } 
     public void setFoobar(String foobar) { 
      this.foobar = foobar; 
     } 
    } 
} 
... 

String in = "{ \"bar\": \"123\", \"qux\" : {\"foobar\": \"234\"}}"; 
ObjectMapper mapper = new ObjectMapper(); 
Foo obj = mapper.readValue(in, Foo.class); 

但是,我得到一个错误

UnrecognizedPropertyException: Unrecognized field "qux" (Class Foo), not marked as ignorable 

我跑2.2。 2

+0

你可以链接教程吗? 'ObjectMapper'默认会尝试映射所有的字段。 –

+0

来自http://wiki.fasterxml.com/JacksonInFiveMinutes的“完整数据绑定(POJO)示例” –

+0

该示例不显示任何缺少的字段。您需要设置特殊配置来忽略这些配置。看到我的答案。 –

回答

1

如果你拉你的Qux类出Foo

public class Foo { 
    private String bar; 

    // added this 
    private Qux qux; 

    public String getBar() { 
     return bar; 
    } 
    public void setBar(String bar) { 
     this.bar = bar; 
    } 

    // added getter and setter 
    public Qux getQux() { 
     return qux; 
    } 
    public void setQux(Qux qux) { 
     this.qux = bar; 
    } 
} 

public static class Qux { 
    private String foobar; 
    public String getFoobar() { 
     return foobar; 
    } 
    public void setFoobar(String foobar) { 
     this.foobar = foobar; 
    } 
} 
+0

确实如此。谢谢你,先生! –

+0

我怀疑Qux类的位置是解决方案。添加qux属性是补救措施。 –

+0

@BrentWorden将Qux类留在_could_可以工作的位置,但也需要'@ JsonIgnoreProperties'属性。 –

2

您可以配置ObjectMapper以忽略在您的课程中找不到的字段

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

如果没有这种配置方式,它会在解析时抛出异常,如果它发现一个它不能识别你指定的类类型的字段。

2

Foo类需要Qux型自动反序列化工作实例属性它将工作。 Foo类当前被定义的方式,没有目标属性来注入JSON对象值。

public class Foo { 
    private String bar; 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

    // additional property 
    private Qux qux; 

    public Qux getQux() { 
     return qux; 
    } 

    public void setQux(Qux value) { 
     qux = value; 
    } 

    public static class Qux { 
     private String foobar; 

     public String getFoobar() { 
     return foobar; 
     } 

     public void setFoobar(String foobar) { 
      this.foobar = foobar; 
     } 
    } 
}