gpt4 book ai didi

java - 如何将动态 JSON 属性映射到固定 POJO 字段

转载 作者:行者123 更新时间:2023-11-30 03:31:57 24 4
gpt4 key购买 nike

我有一些 json 想要解析成 pojo

{
"groups": [
{
"g1": [
1,2,5,6,7
]
},
{
"g2": [
2,3,48,79
]
}
]
}

当然,g1g2是标识符,所以我想象的pojos会是这样的

class Container {
List<Group> groups;
}

class Group {
String id;
List<Integer> values;
}

所以它归结为这个问题:如何使用 jackson 将 json-property 映射到 pojo?

最佳答案

可以使用添加了 JsonDeserialize 注释的自定义反序列化器来解析这种结构。

POJO

public static class Container {
private List<Group> groups;
public List<Group> getGroups() {
return groups;
}
public void setGroups(List<Group> groups) {
this.groups = groups;
}
@Override
public String toString() {
return String.format("Container [groups=%s]", groups);
}
}

@JsonDeserialize(using=CustomDeserializer.class)
public static class Group {
String id;
List<Integer> values;
@Override
public String toString() {
return String.format("Group [id=%s, values=%s]", id, values);
}
}

反序列化器,请注意使用 ObjectMapper.readTree 而不是使用低级 JsonParser API...

public static class CustomDeserializer extends JsonDeserializer<Group> {

@Override
public Group deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
Group group = new Group();
ObjectNode objectNode = new ObjectMapper().readTree(jp);
// assume only a single field...
Entry<String, JsonNode> field = objectNode.fields().next();
group.id = field.getKey();

// there might be a nicer way to do this...
group.values = new ArrayList<Integer>();
for (JsonNode node : ((ArrayNode)field.getValue())) {
group.values.add(node.asInt());
}
return group;
}
}

测试

public static void main(String[] args) throws Exception {
String json = "{\"groups\": [{\"g1\":[1,2,5,6,7]},{\"g2\": [2,3,48,79]}]}";
JsonFactory f = new JsonFactory();
JsonParser jp = f.createParser(json);
ObjectMapper mapper = new ObjectMapper();

System.out.println(mapper.readValue(jp, Container.class));
}

输出

Container [groups=[Group [id=g1, values=[1, 2, 5, 6, 7]], Group [id=g2, values=[2, 3, 48, 79]]]]

关于java - 如何将动态 JSON 属性映射到固定 POJO 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28818895/

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