gpt4 book ai didi

java - 使用 Jackson 自定义反序列化 JSON 字段

转载 作者:搜寻专家 更新时间:2023-11-01 03:32:47 24 4
gpt4 key购买 nike

我正在使用 Jackson 反序列化一些 JSON,但在尝试对其中一个字段使用自定义反序列化程序时遇到了一些麻烦。

class MyClass
{
private static class SpecialPropertyDeserializer extends JsonDeserializer<SpecialProperty>
{
@Override
public SpecialProperty deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException, JsonProcessingException
{
// do some custom deserialisation
}
}

private static class SpecialProperty
{
private String m_foo;

private String m_bar;

@JsonCreator
SpecialProperty(@JsonProperty("foo") String foo,
@JsonProperty("bar") String bar)
{
m_foo = foo;
m_bar = bar;
}
}

private String m_identifier;

private String m_version;

@JsonDeserialize(using = SpecialPropertyDeseializer.class)
private SpecialProperty m_specialProperty;

@JsonCreator
MyClass(@JsonProperty("identifier") String identifier,
@JsonProperty("version") String version,
@JsonProperty("specialProperty") SpecialProperty specialProperty)
{
m_identifier = identifier;
m_version = version;
m_specialProperty = specialProperty;
}
}

这是我要反序列化的 JSON:

{
"identifier" : "some-id",
"version" : "1.7",
"specialProperty" : {
"foo" : "str1",
"bar" : "str2"
},
}

我按如下方式调用映射器:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
return objectMapper.readValue(input, MyClass.class);

我观察到以下行为:

  1. 没有特殊属性,一切正常 - 即删除所有从代码和 JSON 中引用 SpecialProperty
  2. 如果我在 JSON 中包含 SpecialProperty 但删除自定义它的反序列化器然后它也可以正常工作。的ctorSpecialProperty 被调用。
  3. 使用自定义反序列化器它不起作用。调用了 SpecialProperty 的构造函数,但未调用自定义反序列化器。

我做错了什么?

最佳答案

@JsonDeserialize 注释可以放在字段、setter 或类上。如果注释的是它用来设置值的内容, jackson 将考虑它。

例如 1 如果它使用 setter 来设置字段的值,它将注意到 @JsonDeserialize 超过了 setter。

例如 2 如果不使用 setter 或构造函数直接设置该字段,它将注意到 @JsonDeserialize

如果它在类中,它将倾向于考虑它,除非它被字段或 setter 上更具体的注释覆盖 docs .我认为文档在上述细节上可能会更清楚。

在您的情况下,您在 SpecialProperty 字段上有注释,但您在 MyClass 构造函数中设置此字段,因此它会被忽略。

在这种情况下,您可以将 @JsonDeserialize 移动到类而不是字段上。在您的情况下,这可能是最简单的解决方案。例如

@JsonDeserialize(using = MyClass.SpecialPropertyDeserializer.class)
private static class SpecialProperty {

或者您可以完全跳过注释并在映射器上注册反序列化器。首先在 MyClass 中使 SpecialPropertySpecialPropertyDeserializer 非私有(private),然后:

ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(MyClass.SpecialProperty.class, new MyClass.SpecialPropertyDeserializer());
objectMapper.registerModule(module);

您还可以删除 MyClass 的构造函数,并且将考虑 SpecialProperty 字段上的当前注释。

关于java - 使用 Jackson 自定义反序列化 JSON 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44327247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com