繁体   English   中英

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

[英]How to deserialize an array of objects using Jackson or any other api?

我有一个需要映射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,这是我必须映射到如下的Container类的内容:

[  
  {  
    "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": [
],

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

该代码对我有用:

Port.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
容器编号:c00afc1ae5787282fd92b3dde748d203a83308d18aaa566741bef7624798af10
容器编号:d70f439231d99889c1a8e96148f13a77cb9b83ecf8c9d4c691ddefa40286c04c

我很惊讶您在尝试反序列化对象时没有遇到异常。 当我在本地运行代码时,

线程“主”中的异常com.fasterxml.jackson.databind.JsonMappingException:无法从START_OBJECT令牌中反序列化java.util.ArrayList实例

看起来像是您尝试在将其作为JSON对象时序列化为Array的原因。

"Labels":{  

},

那是一个JSON对象,因此您应该更改类型以反映它的含义,或者将该JSON属性的序列化更改为数组。 如果只想更改Container类中的类型,则应使用Map

@JsonProperty("Labels")
private Map<String, Object> Labels;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM