【问题标题】:Convert JSON to a Java object with a calculated field将 JSON 转换为具有计算字段的 Java 对象
【发布时间】:2016-02-03 17:14:26
【问题描述】:

我有这个 JSON 对象:

[
    {
      "field1": "xxxxx",
      "field2": "vvvvvv",
      "field3": "cccccc",
      "field4": "zzzzzzz"
    },
    {
      "field1": "aaaaa",
      "field2": "ssssss",
      "field3": "dddddd",
      "field4": "ffffff"
    }
]

我正在使用 FasterXML 的 Jackson 库将此 JSON 反序列化到我的班级 Foo。这个结构是这样的:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
    private String id;

    @JsonProperty("field1")
    private String customField1;

    @JsonProperty("field2")
    private String customField2;

    @JsonProperty("field3")
    private String customField3;

    @JsonProperty("field4")
    private String customField4;
    ................
 }

我想在反序列化时计算字段id 的值。该值是customField4customField3 连接的结果。是否可以执行这种操作,或者我需要将此值传递到我的 JSON 中吗?

【问题讨论】:

  • 你能展示你的预期结果吗?
  • 你为什么不直接添加到你的 json 中?
  • @Patrick 我会有一个带有id=cutomField4+customField3的对象
  • 为什么不直接使用getter? private String id(){return cutomField4+customField3;}
  • private getter 不太有用 ;)

标签: java json serialization jackson fasterxml


【解决方案1】:

好的,解决方案是设置自定义

@JsonDeserialize(using = EntityJsonDeserializerCustom.class)

通过这种方式,我创建了一个通用静态类,其中只有 json 返回的字段,然后我重写了反序列化方法以返回我的带有计算字段的对象

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonDeserialize(using = EntityJsonDeserializerCustom.class)
public class Foo {


    private String id;

    @JsonProperty("field1")
    private String customField1;

    @JsonProperty("field2")
    private String customField2;

    @JsonProperty("field3")
    private String customField3;

    @JsonProperty("field4")
    private String customField4;
    ................
 }


public class EntityJsonDeserializerCustom extends JsonDeserializer<Foo> {

    @Override
    public Foo deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {

        InnerFoo innerFoo = jp.readValueAs(InnerFoo.class);

        Foo foo = new Foo();
        foo.setField1(innerFoo.field1);
        foo.setField2(innerFoo.field2);
        foo.setField3(innerFoo.field3);
        foo.setField4(innerFoo.field4);
        foo.setId(innerFoo.field4 + innerFoo.field3);


        return foo;
    }

    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class InnerFoo {
        @JsonProperty("field1")
        private String customField1;

        @JsonProperty("field2")
        private String customField2;

        @JsonProperty("field3")
        private String customField3;

        @JsonProperty("field3")
        private String customField4;
    }
}

通过这种方式我解决了我的问题,我希望这对社区有帮助:D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多