2014-10-31 51 views
0

问题1问题:
两个约JsonProperty

class Point { 
    private int x; 
    private int y; 
    @JsonCreator 
    public Point(@JsonProperty("x") int x, @JsonProperty("y") int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

class Point { 
    @JsonProperty("x") 
    private int x; 
    @JsonProperty("y") 
    private int y; 
    @JsonCreator 
    public Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

等同?

问题2:
如果我有没有出现在构造函数的参数,如字段:

class Point { 
    private int x; 
    private int y; 
    private int z; 
    @JsonCreator 
    public Point(@JsonProperty("x") int x, @JsonProperty("y") int y) { 
     this.x = x; 
     this.y = y; 
     z = 0; 
    } 
} 

不杰克逊仍然知道那场(z)和它的价值?

+0

1.不,可能它们不相同。第一个是要走的路。第二种情况需要默认的构造函数,因为Jackson似乎并不试图从参数名称中猜出字段名称。 – user3159253 2014-10-31 15:10:41

+0

2.使用默认设置Jackson简单地忽略所有私人字段。 – user3159253 2014-10-31 15:11:23

回答

0

为了序列化/反序列化类的私人领域,没有正式的getter/setter方法,我必须做到以下几点:

mapper.enable(MapperFeature.CAN_OVERRIDE_ACCESS_MODIFIERS); 
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); 

,也定义了私人默认构造我的课,像这样:

public class ElementDesc { 
    @SuppressWarnings("unused") 
    private ElementDesc() { this(null, null, false); } 

    public ElementDesc(/* a regular constructor with parameters etc */) { 
    ... 
    } 

    private final String field1; 
    private final String field2; 
    private final boolean field3; 
} 

在这种情况下,Jackson可以成功地序列化/反序列化无需使用常规构造函数和(访问器)方法(如果有)的类的实例。