gpt4 book ai didi

java - Jackson 将 JSON 对象字段反序列化为单个列表属性

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:49:04 26 4
gpt4 key购买 nike

我只是想知道,给定一个 pojo:

public class MyProfileDto {
private List<String> skills;
//mutators; getSkills; setSkills + bunch of other fields
}

技能字段的 JSON:

"skills":{
"values":[
{
"id":14,
"skill":{
"name":"C++"
}
},
{
"id":15,
"skill":{
"name":"Java"
}
}
],
"_total":2
}

有没有什么方法可以使用 Jackson 将技能/值/技能/名称字段(即“Java”、“C++”)放入目标 Dto 的字符串列表中,而无需为整个 Dto 创建自定义反序列化器?它有很多字段,所以一个理想的解决方案会尽可能涉及一个字段的一些自定义注释或反序列化程序??

最佳答案

Jackson 不包含任何 XPath 特性,但您可以为每个属性定义转换器。 Jackson 将使用此转换器将输入类型转换为您需要的输出类型。在您的示例中,输入类型是 Map<String, Object>输出类型为 List<String> .这可能不是我们可以使用的最简单和最好的解决方案,但它允许我们只为一个属性定义转换器,而无需为整个实体定义反序列化器。

您的 POJO 类:

class MyProfileDto {

@JsonDeserialize(converter = SkillConverter.class)
private List<String> skills;

public List<String> getSkills() {
return skills;
}

public void setSkills(List<String> skills) {
this.skills = skills;
}
}

转换器List<String> skills;属性:

class SkillConverter implements Converter<Map<String, Object>, List<String>> {

@SuppressWarnings("unchecked")
public List<String> convert(Map<String, Object> value) {
Object values = value.get("values");
if (values == null || !(values instanceof List)) {
return Collections.emptyList();
}

List<String> result = new ArrayList<String>();
for (Object item : (List<Object>) values) {
Map<String, Object> mapItem = (Map<String, Object>) item;
Map<String, Object> skillMap = (Map<String, Object>) mapItem.get("skill");
if (skillMap == null) {
continue;
}

result.add(skillMap.get("name").toString());
}

return result;
}

public JavaType getInputType(TypeFactory typeFactory) {
return typeFactory.constructMapLikeType(Map.class, String.class, Object.class);
}

public JavaType getOutputType(TypeFactory typeFactory) {
return typeFactory.constructCollectionLikeType(List.class, String.class);
}
}

和示例用法:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.type.TypeFactory;
import com.fasterxml.jackson.databind.util.Converter;

public class JacksonProgram {

public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();

MyProfileDto dto = mapper.readValue(new File("/x/json"), MyProfileDto.class);

System.out.println(dto.getSkills());
}
}

以上程序打印:

[C++, Java]

关于java - Jackson 将 JSON 对象字段反序列化为单个列表属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18708533/

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