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

时间:2015-04-09 22:15:38

标签: java json serialization jackson customization

我们说我有以下课程:

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;
    }
}

当杰克逊序列化MyClass的实例时,它将如下所示:

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

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

当杰克逊序列化MyClass的实例时,我希望看到以下输出之一:

{"t":"50.50"}

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

2 个答案:

答案 0 :(得分:5)

如果你想制作

{"t":"50.50"}

您可以使用@JsonValue表示

  

注释" getter"的结果方法(这意味着签名   必须是吸气剂的;将使用非void返回类型,无args)   作为实例序列化的单个值。

@JsonValue
public String toCustomString() {
    return test + "." + test;
}

如果你想制作

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

您可以使用自定义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;

答案 1 :(得分:4)

您正在寻找@JsonProperty注释。把它放到你的方法:

@JsonProperty("test")
public String toCustomString() {
    return test + "." + test;
}

此外,杰克逊一直拒绝序列化MyClass,因此为避免出现问题,您可以在t属性中添加一个简单的getter。