4

我有一个类,它或多或少是一个围绕双精度的包装类。当我通过杰克逊序列化我的课程时,我会收到类似的信息:{“value”:123.0}。我基本上希望发生的是,杰克逊只给了我 123.0。如果我可以扩展 Number,我的问题将得到解决,但由于我已经在扩展另一个类,所以这不是一个选项。

班级:

@JsonIgnoreProperties(ignoreUnknown = true)
@SuppressWarnings("unused")
public class TestValue {
    @JsonProperty
    private final Double d;

    public TestValue(Double d) {
        this.d = d;
    }
}

结果是:

{
  "d" : 123.0
}

什么会像预期的那样工作:

public class TestValue extends Number {
    private final Double d;

    public TestValue(Double d) {
        this.d = d;
    }

    public double doubleValue() {
        return d;
    }

    public float floatValue() {
        return d.floatValue();
    }

    public int intValue() {
        return d.intValue();
    }

    public long longValue() {
        return d.longValue();
    }

    public String toString() {
        return d.toString();
    }
}

..导致:123.0

但是 - 你知道 - 我已经在扩展另一个抽象类。我怎样才能得到预期的结果?

4

3 回答 3

5

由于我确信有人可以重用它,我将回答我自己的问题(感谢 Gavin 向我展示的方式):

public class TestValue {
    private final Double d;

    public TestValue(Double d) {
        this.d = d;
    }

    @JsonValue
    public Double getValue() {
        return d;
    }
}
于 2013-01-06T10:19:02.327 回答
2

看来您要自定义序列化,请参见此处

于 2013-01-06T09:54:47.563 回答
1

首先,为 type 创建一个自定义序列化程序TestValue

public class TestValueSerializer extends JsonSerializer<TestValue> {
@Override
public void serialize(TestValue value, JsonGenerator gen, SerializerProvider provider) throws IOException,
        JsonProcessingException {
    gen.writeString(value.toString());
}

}

@JsonSerialize(using=TestValueSerializer.class)然后在类型之前添加注释TestValue

顺便说一句,即使TestValue没有扩展其他类,最好避免从Number. 始终谨慎使用实现继承。

于 2013-01-06T10:16:51.567 回答