gpt4 book ai didi

java - 嵌套 Jackson WRAPPER_OBJECT 的多层

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:15 24 4
gpt4 key购买 nike

我绝不是 Jackon/JSON 向导,这可能从我遇到的以下问题中可以看出:

我收到了 2 种可能的数据结构。第一个称为 amountTransaction:

{
"amountTransaction": {
"clientCorrelator":"54321",
"endUserId":"tel:+16309700001"
}
}

它由以下 Java 对象表示:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonTypeName(value = "amountTransaction")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class AmountTransaction {
private String clientCorrelator;
private String endUserId;
...
}

然而,amountTransaction 对象也作为 paymentTransactionNotification 对象的子元素出现:

{
"paymentTransactionNotification": {
"amountTransaction": {
"clientCorrelator": "54321",
"endUserId": "tel:+16309700001"
}
}
}

..我认为可以表示为:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonTypeName(value = "paymentTransactionNotification")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PaymentTransactionNotification {
private AmountTransaction amountTransaction;
...
}

单独使用 amountTransaction 对象解析 JSON 工作正常。这是一个非常简单的 WRAPPER_OBJECT 示例。

但是,当我尝试为 paymentTransactionNotification 解析 JSON 时,我收到一个异常,表明它无法将 amountTransaction 正确处理为 paymentTransactionNotification 的元素:

com.fasterxml.jackson.databind.JsonMappingException: Could not resolve type id 'clientCorrelator' into a subtype of [simple type, class com.sf.oneapi.pojos.AmountTransaction]

关于如何正确注释它以便我的代码能够正确处理独立的和封装的 amountTransaction 对象有什么想法吗?

最佳答案

默认情况下,Jackson 中的包装根节点是禁用的。您可以包装内部对象,但如果您想包装根节点,则需要为其启用 jackson 功能(https://jira.codehaus.org/browse/JACKSON-747):

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationConfig.Feature.WRAP_ROOT_VALUE);
objectMapper.enable(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE);

当您启用这些功能时,您已经说过 Jackson 包装根元素,您不再需要 @JsonTypeInfo 和 @JsonTypeName。您可以简单地删除它们。但是现在你需要自定义根节点名称,你可以使用@JsonRootName。您的类(class)应如下所示:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName("amountTransaction")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class AmountTransaction {
private String clientCorrelator;
private String endUserId;
...............
}

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName("paymentTransactionNotification")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PaymentTransactionNotification {
private AmountTransaction amountTransaction;
.............
}

我已经尝试过,Jackson 按预期转换了两个 JSON 请求。

关于java - 嵌套 Jackson WRAPPER_OBJECT 的多层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27037896/

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