簡體   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