gpt4 book ai didi

java - Jackson:用于反序列化内部集合的对象映射器注释

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:09:28 27 4
gpt4 key购买 nike

我想将下面的json转换成java对象,使用尽可能多的注解

{"user":{
"id":1,
"diets":[
{"diet":{
"name":"...",
"meals":[]
}
}
]
}
}

我在收集饮食方面遇到了麻烦。我尝试使用 @JsonProperty 但它无法正常工作。 map 内部聚合是否有特殊注释?

Diet.java

    @JsonRootName(value = "diet")
public class Diet {

@JsonProperty(value="name")
private String name;
@JsonProperty(value="meals")
private List<Meal> meals;
private User user;

// Rest of the class omitted.
}

用户.java

@JsonRootName(value = "user")
public class User {

@JsonProperty("id")
private long id;
@JsonProperty("diets")
private List<Diet> diets = new ArrayList<Diet>();

// Rest of the class omitted.
}

谢谢!

最佳答案

您的 json 中的 diets 对象不是列表。它是一个键值对列表,键为“饮食”,值是一个饮食对象。所以你在这里有三个选择。

一个是创建一个包装器对象,比如 DietWrapper 并在 User 中使用 diet wrapper 列表

@JsonRootName(value = "user")
class User {

@JsonProperty(value = "id")
private long id;
@JsonProperty(value = "diets")
private List<DietWrapper> diets;

//Getter & Setters
}

class DietWrapper {
@JsonProperty(value = "diet")
Diet diet;
}

第二个选项是将 diest 保持为简单的 map 列表,如 List>

@JsonRootName(value = "user")
class User {

@JsonProperty(value = "id")
private long id;
@JsonProperty(value = "diets")
private List<Map<String, Diet>> diets;

//Getter & Setters
}

第三种选择是使用自定义反序列化器,它会忽略您的饮食类别。

@JsonRootName(value = "user")
class User {

@JsonProperty(value = "id")
private long id;
@JsonProperty(value = "diets")
@JsonDeserialize(using = DietDeserializer.class)
private List<Diet> diets;

//Getter & Setters
}

class DietDeserializer extends JsonDeserializer<List<Diet>> {

@Override
public List<Diet> deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException {

ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonParser);
List<Diet> diets = mapper.convertValue(node.findValues("diet"), new TypeReference<List<Diet>>() {});
return diets;
}
}

关于java - Jackson:用于反序列化内部集合的对象映射器注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25185545/

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