如何让Jackson使用一种方法将类序列化为JSON?

pac*_*low 7 java customization serialization json jackson

假设我有以下课程:

public class MyClass {
    private Test t;

    public MyClass() {
        t = new Test(50);
    }
}

public class Test {
    private int test;

    public Test(int test) {
        this.test = test;
    }

    public String toCustomString() {
        return test + "." + test;
    }
}
Run Code Online (Sandbox Code Playgroud)

当Jackson序列化一个实例时MyClass,它将如下所示:

{"t":{"test":50}}

我是否可以在Test类中添加注释以强制Jackson toCustomString()在序列化Test对象时调用该方法?

当Jackson序列化一个实例时,我想看到以下输出之一MyClass:

{"t":"50.50"}

{"t":{"test":"50.50"}}

mty*_*urt 5

您正在寻找@JsonProperty注释。只需将其放入您的方法即可:

@JsonProperty("test")
public String toCustomString() {
    return test + "." + test;
}
Run Code Online (Sandbox Code Playgroud)

另外,Jackson始终拒绝序列化MyClass,因此为了避免出现问题,您可以在t属性中添加一个简单的getter 。


Sot*_*lis 5

如果你想生产

{"t":"50.50"}
Run Code Online (Sandbox Code Playgroud)

你可以用@JsonValue哪个表示

注释"getter"方法的结果(这意味着签名必须是getter;非void返回类型,没有args)将被用作实例序列化的单个值.

@JsonValue
public String toCustomString() {
    return test + "." + test;
}
Run Code Online (Sandbox Code Playgroud)

如果你想生产

{"t":{"test":"50.50"}}
Run Code Online (Sandbox Code Playgroud)

你可以使用自定义JsonSerializer.

class TestSerializer extends JsonSerializer<Integer> {
    @Override
    public void serialize(Integer value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        jgen.writeString(value + "." + value);
    }
}
...
@JsonSerialize(using = TestSerializer.class)
private int test;
Run Code Online (Sandbox Code Playgroud)