【问题标题】:Jackson: treat object as primitive杰克逊:将对象视为原始对象
【发布时间】:2012-12-20 07:05:10
【问题描述】:

我有一个类,它或多或少是一个围绕双精度的包装类。当我通过杰克逊序列化我的课程时,我会收到类似的信息:{“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

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

【问题讨论】:

    标签: java jackson


    【解决方案1】:

    既然我确信有人可以重复使用它,我将回答我自己的问题(感谢 Gavin 为我指路):

    public class TestValue {
        private final Double d;
    
        public TestValue(Double d) {
            this.d = d;
        }
    
        @JsonValue
        public Double getValue() {
            return d;
        }
    }
    

    【讨论】:

      【解决方案2】:

      好像要自定义序列化,见here

      【讨论】:

      • 谢谢,这引导我走向正确的方向。实际上它让我想到了另一个问题:stackoverflow.com/questions/7161638/… 所以解决方案要简单得多,使用 @JsonValue 注释对我来说就足够了 - 谢谢!
      【解决方案3】:

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

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

      }

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-05
        • 1970-01-01
        • 2022-06-22
        • 1970-01-01
        • 2012-01-06
        • 2017-10-03
        • 2017-06-18
        • 1970-01-01
        相关资源
        最近更新 更多