杰克逊基于场的序列化

jac*_*ver 7 java json jackson

我认为杰克逊基于方法的序列化,有什么方法可以让它基于字段?

例如:

class Bean {
    Integer i;
    String s;

    public Integer getI() { return this.i; }
    public void setI(Integer i) { this.i = i; }
    public bool isSetI() { return this.i != null; }

    // same for s as well
}
Run Code Online (Sandbox Code Playgroud)

输出JSON具有"i"和"setI".无论如何我可以覆盖这个只获得"我"?如果有一种方法可以在不向类中添加任何注释(它们是自动生成的)的情况下也会很棒.

Joh*_*hnC 11

查看@JsonAutoDetect注释.例:

@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility=Visibility.NONE)
public class Bean {
    Integer i;
    String s;

    Integer getI() { return this.i; }
    void setI(Integer i) { this.i = i; }
    bool isSetI() return { this.i == null; }

    // same for s as well
}
Run Code Online (Sandbox Code Playgroud)


Sta*_*Man 6

杰克逊也可以使用领域,是的; 但默认情况下,只发现公共字段.但您可以使用@JsonProperty标记非公共字段.

需要注意的一点是,如果同时存在方法(setX,getX)和字段(x),则方法将具有优先权.这通常不是问题,但如果是,则需要通过向@JsonIgnore它们添加enxt来显式地禁用不使用的方法.


Nil*_*zor 5

要在没有注释的情况下完成此操作,可以ObjectMapper按以下方式配置序列化/反序列化之前:

ObjectMapper om = new ObjectMapper();
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker().
            withGetterVisibility(JsonAutoDetect.Visibility.NONE).
            withSetterVisibility(JsonAutoDetect.Visibility.NONE));
Run Code Online (Sandbox Code Playgroud)