繁体   English   中英

如何将原始 JSON 反序列化为 Java object 和 Jackson

[英]How to deserialize raw JSON to Java object with Jackson

我有两个 POJO:

@lombok.Value
public class Foo {
  String foo;
  Bar bar;
}

@lombok.Value
public class Bar {
  String bar;
  String baz;
}

我希望能够将以下内容反序列化为Foo实例:

{
  "foo": "some foo",
  "bar": "{ \"bar\": \"some bar\", \"baz\": \"some baz\" }"
}

如果我理解正确的话,这与@JsonRawValue完全相反。 在那里,它将 Java 字符串值(有效的 JSON 值)转换为 JSON object。但在这里,我需要将 JSON 字符串值转换为 Java 8828288954
我怀疑我需要编写一个自定义解串器,但我不确定具体是怎么做的,因为它涉及解析原始 JSON 并将其分配给该字段。 也许BeanDeserializerModifier (我不知道如何使用它。)
我想保持 object 不可变( @Value ),但如果它有助于解决问题,我可以放弃这个要求。
谢谢。

如果你使用 FooDto class 删除这个Bar bar; 从 DtoClass

或使用这个

@lombok.Value
public class Foo {
  String foo;
  @JsonIgnore
  Bar bar;
}

在@Michał Ziober 提到的这个问题的帮助下,我设法做到了。 将它发布在这里以供参考,因为让它工作有点棘手(使用 JSON 中的@ValueCamelCase属性命名):

{
  "Foo": "some foo",
  "Bar": "{ \"bar\": \"some bar\", \"baz\": \"some baz\" }"
}

实现是:

@Value
@Builder
@JsonDeserialize(builder = Foo.FooBuilder.class)
public class Foo {
    @JsonAlias("Foo") // note this!
    String foo;
    Bar bar;

    @JsonPOJOBuilder(withPrefix = "")
    public static class FooBuilder {
        @JsonAlias("Bar") // note this!
        @JsonDeserialize(using = BarDeserializer.class)
        public FooBuilder bar(Bar bar) {
            this.bar = bar;
            return this;
        }
    }
}

@lombok.Value
public class Bar {
  String bar;
  String baz;
}

public class BarDeserializer extends StdDeserializer<Bar> {
    public BarDeserializer() {
        super(Bar.class);
    }

    @Override
    public Bar deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
        return (Bar) ((ObjectMapper) p.getCodec()).readValue(p.getValueAsString(), _valueClass);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM