gpt4 book ai didi

java - 如何使用 Jackson 或任何其他 api 反序列化对象数组?

转载 作者:行者123 更新时间:2023-12-02 04:44:15 25 4
gpt4 key购买 nike

我定义了一个模型,我需要将 jsonArray 映射到该模型。模型如下:

@JsonPropertyOrder({
"Command",
"Created",
"Id",
"Image",
"Labels",
"Names",
"Ports",
"Status"
})
public class Container {

@JsonProperty("Command")
private String Command;

@JsonProperty("Created")
private long Created;

@JsonProperty("Id")
private String Id;

@JsonProperty("Image")
private String Image;

@JsonProperty("Labels")
private List<String> Labels;

@JsonProperty("Names")
private List<String> Names = new ArrayList<String>();

@JsonProperty("Ports")
private List<Port> Ports = new ArrayList<Port>();

@JsonProperty("Status")
private String Status;

//Getters and Setters
}

响应是 JSONArray,这就是我必须映射到容器类的内容,如下所示:

[  
{
"Command":"/usr/sbin/sshd -D",
"Created":1429686533,
"Id":"c00afc1ae5787282fd92b3dde748d203a83308d18aaa566741bef7624798af10",
"Image":"jay8798:latest",
"Labels":{

},
"Names":[
"/jay8798"
],
"Ports":[
{
"IP":"0.0.0.0",
"PrivatePort":22,
"PublicPort":32845,
"Type":"tcp"
},
{
"IP":"0.0.0.0",
"PrivatePort":3306,
"PublicPort":32846,
"Type":"tcp"
}
],
"Status":"Up 12 hours"
},
{
"Command":"/usr/sbin/sshd -D",
"Created":1429686039,
"Id":"d70f439231d99889c1a8e96148f13a77cb9b83ecf8c9d4c691ddefa40286c04c",
"Image":"jay898:latest",
"Labels":{

},
"Names":[
"/jay898"
],
"Ports":[
{
"IP":"0.0.0.0",
"PrivatePort":22,
"PublicPort":32841,
"Type":"tcp"
},
{
"IP":"0.0.0.0",
"PrivatePort":3306,
"PublicPort":32842,
"Type":"tcp"
}
],
"Status":"Up 12 hours"
}
]

这是我尝试过的,但似乎没有任何效果:

Container[] containerList = mapper.readValue(containerResponse, Container[].class);
int totalContainers = containerList.length;

//This will return correct length of the container.
System.out.println("This is the retrived size : " + containerList.length);

for(Container cont : containerList) {
// this statement will print 'null'.There is no exception thrown at this point.
System.out.println("Container Id : "+cont.getId());
}

或者

List<Container> containerList = 
mapper.readValue(containerResponse, new TypeReference<List<MyClass>>(){});

我关注了Jackson Deserialize并尝试了帖子中提到的所有解决方案。它无法映射到模型。它读取值时所有字段均为空。没有值映射到 Container 类的属性。模型中缺少任何内容,还是我需要编写客户逻辑来反序列化 json?

最佳答案

首先,我假设

"Labels": {
},

实际上应该是

"Labels": [
],

因为您已将其定义为字符串列表,而不是它自己的对象。

这段代码对我有用:

端口.java:

public class Port {
@JsonProperty("IP")
private String ip;

@JsonProperty("PrivatePort")
private int privatePort;

@JsonProperty("PublicPort")
private int publicPort;

@JsonProperty("Type")
private String type;

// Getters and setters
}

主函数:

String json = ... // Your JSON with the above correction
ObjectMapper objectMapper = new ObjectMapper();
List<Container> containers = objectMapper.readValue(json, new TypeReference<List<Container>>() {});
System.out.println(containers.size());
for(Container container : containers) {
System.out.println("Container Id : " + container.getId());
}

2
Container Id : c00afc1ae5787282fd92b3dde748d203a83308d18aaa566741bef7624798af10
Container Id : d70f439231d99889c1a8e96148f13a77cb9b83ecf8c9d4c691ddefa40286c04c

关于java - 如何使用 Jackson 或任何其他 api 反序列化对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29807818/

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