解决 Jackson 中属性的冲突 getter 定义

问题描述 投票:0回答:1

我有以下课程:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Getter
@Setter
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Options {
    @JsonProperty("value")
    private String value;
    @JsonProperty("value")
    private Value valueObj;
}

我在使用 Jackson 时看到以下错误:

Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Conflicting getter definitions for property "value": Options#getValue() vs Options#getValueObj()

我的JSON是这样的:

{
    "behaviors": [
        {
            "name": "dnsAsyncRefresh",
            "options": {
                "enabled": true,
                "timeout": "1h",
                "value": {
                    "id": "1234"
                }
            }
        },
        {
            "name": "timeout",
            "options": {
                "value": "5s"
            }
        }
    ]
}

我使用相同的

Options
类来映射 JSON 中的所有选项。

json jackson objectmapper
1个回答
0
投票

出现此问题的原因是您有两个用

@JsonProperty("value")
注释的字段,导致反序列化过程中发生冲突。在您的
Options
类中,
value
valueObj
都使用相同的 JSON 属性名称“value”进行注释。 Jackson 在遇到 JSON 中的“value”属性时无法确定要映射哪个字段。

一个简单的解决方案是:

  1. 重命名
    Options
    类中的属性之一以避免冲突。例如,将第二个属性重命名为
    valueObject
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Options {
    @JsonProperty("value")
    private String value;
    
    @JsonProperty("valueObject")
    private Value valueObject;
}
  1. 相应地调整您的 JSON 结构:
{
    "behaviors": [
        {
            "name": "dnsAsyncRefresh",
            "options": {
                "enabled": true,
                "timeout": "1h",
                "valueObject": { // <--- Here
                    "id": "1234"
                }
            }
        },
        {
            "name": "timeout",
            "options": {
                "value": "5s"
            }
        }
    ]
}

通过将第二个属性重命名为

valueObject
并相应地更新 JSON,您可以消除冲突,并且 Jackson 将能够正确地将 JSON 反序列化到
Options
类中。

© www.soinside.com 2019 - 2024. All rights reserved.