【问题标题】:How to have Jackson use a method to serialize a class to JSON?如何让杰克逊使用一种方法将类序列化为 JSON?
【发布时间】:2015-04-09 22:15:38
【问题描述】:

假设我有以下课程:

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

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

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

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

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

{"t":"50.50"}

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

【问题讨论】:

    标签: java json serialization jackson customization


    【解决方案1】:

    如果你想生产

    {"t":"50.50"}
    

    您可以使用@JsonValue 表示

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • Jackson 在序列化时寻找 getter 和 @JsonProperty 注解的方法。在您的情况下,输出将是 {"t":"50.50"}
      • 哦,抱歉,我没抓住重点。为了产生你的输出,属性值应该是test,我现在正在编辑。
      • 我喜欢您的回答,因为它是生成 {"t":{"test":"50.50"}} 而不是使用自定义序列化程序的更简单的替代方法。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多