gpt4 book ai didi

java - 使用 Jackson 反序列化时如何映射重复命名的字段?

转载 作者:行者123 更新时间:2023-12-01 12:38:55 28 4
gpt4 key购买 nike

我有一个简单的 Java 类,如下所示:

public class AllAdverts {

@JsonIgnoreProperties(value="id", ignoreUnknown=true)
public static class Advert {

@JsonProperty(value="_id")
public String advertId;

public String adgroupId;
}

public List<Advert> adverts;

public AllAdverts(String json) throws IOException {
this.adverts = MyUtils.mapper.readValue(json,
new TypeReference<List<Advert>>(){});
}
}

我正在尝试反序列化以下 JSON:

[
{
"_id": "535788abf789b8916a8b456e",
"adgroup_id": "535788abf789b8916a8b456c",
"subcampaign_id": "535788abf789b8916a8b4569",
"id": 6005879321807,
},
{
"_id": "535788abf789b8916a8b456f",
"adgroup_id": "535788abf789b8916a8b456c",
"subcampaign_id": "535788abf789b8916a8b4569",
"id": 6005879319007,
}
]

当我将 JSON 传递到类 AllAdverts 的构造函数中时,除了名为 advertId 的字段之外,JSON 都会正确映射。

正如您所看到的,JSON 有两个名为 id_id 的字段,我认为 Jackson 将这两个字段视为 id,因此,我无法加载这个。我该如何解决这个问题?我一直在深入研究文档,并认为 JsonProperty 注释可以解决这个问题,但它没有起作用。虽然 adgroupId 有值,但 advertIdnull

最佳答案

您的映射器是否使用/删除下划线并将大写字母替换为小写字母来填充 bean 属性?因为这似乎就是正在发生的事情。如果没有,Jackson 就不会填写 adgroupId 字段。

检查您的映射器。

下面是我的代码,完全没有问题(意识到我必须注释 adgroupId 字段,因为 json 和 pojo 字段之间的名称差异:

Main.java

import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {

public static void main(String[] args) throws Exception {
new Main().start();
}

public List<Advert> adverts;

private void start() throws Exception {

String jsonString =
"[" +
"{" +
"\"_id\": \"535788abf789b8916a8b456e\"," +
"\"adgroup_id\": \"535788abf789b8916a8b456c\"," +
"\"subcampaign_id\": \"535788abf789b8916a8b4569\"," +
"\"id\": 6005879321807," +
"}," +
"{" +
"\"_id\": \"535788abf789b8916a8b456f\"," +
"\"adgroup_id\": \"535788abf789b8916a8b456c\"," +
"\"subcampaign_id\": \"535788abf789b8916a8b4569\"," +
"\"id\": 6005879319007," +
"}" +
"]";

ObjectMapper mapper = new ObjectMapper();

JSONArray jsonArray = new JSONArray(jsonString);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);

Advert advert = mapper.readValue(jsonObject.toString(), Advert.class);

System.out.println("advertId: " + advert.advertId);
System.out.println("adgroupId: " + advert.adgroupId);
}

}

}

Advert.java

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(value = "id", ignoreUnknown = true)
public class Advert {

public Advert() {}

@JsonProperty(value = "_id")
public String advertId;

@JsonProperty(value = "adgroup_id")
public String adgroupId;

}

我正在使用 Jackson 2.4.1。

关于java - 使用 Jackson 反序列化时如何映射重复命名的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25307994/

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