【问题标题】:Using @JsonTypeInfo why can't the polymorphic field be omitted?使用@JsonTypeInfo 为什么不能省略多态字段?
【发布时间】:2016-11-17 08:10:17
【问题描述】:

这是一个多态字段:

@JsonProperty("配置") @JsonTypeInfo(使用 = JsonTypeInfo.Id.NAME,包括 = JsonTypeInfo.As.EXTERNAL_PROPERTY,属性 =“类型”) @JsonSubTypes({ @JsonSubTypes.Type(name = "keystone", value = KeystoneConfig.class), @JsonSubTypes.Type(name = "internal", value = InternalConfig.class) }) @Nullable 抽象配置 getConfig();

其中Configuration 是一个接口,type 是结构/类中其他位置的String 字段。

这适用于这样的响应负载(东西):

{“类型”:“内部”, “配置”:{“int1”:“值1”} }

但在省略 config 字段时会失败并出现反序列化解析错误,如下所示:

{“类型”:“内部” }

通常,当字段被省略时,我们会得到 Java 默认值(在这种情况下我期望 null)。我希望保留鉴别器字段type,但允许config 字段是可选的。

在这种情况下我怎样才能得到这种行为?

【问题讨论】:

  • 遇到了同样的问题,当它应该为空时,通过返回一个新的对象(这里提到的类型以外的类型)来修复它。例如@JsonSubTypes.Type(name = "noConfig", value = NullConfig.class)

标签: java jackson


【解决方案1】:

JacksonAnnotationIntrospectorJsonDeserializerJsonTypeResolver 似乎对您的情况没有帮助。 目前,我只能通过以下 3 步反序列化 json 字符串来解决问题:

ObjectMapper mapper = new ObjectMapper();
// 1. deserializing the json string into JsonNode
JsonNode jsonNode = mapper.readTree(json);
// 2. Add a empty node if "config" property is not found
JsonNode configNode = jsonNode.get("config");
if (jsonNode.isObject() && (configNode == null || configNode.size() == 0)) {
    ((ObjectNode) jsonNode).put("config", "");
}
// 3. Convert to desired class
mapper.treeToValue(jsonNode, Foo.class);

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 2020-12-13
    • 2018-09-29
    • 2012-01-27
    • 2017-09-10
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多