使用Jackson将JSON转换为Java对象

Converting JSON to a java object using Jackson

本问题已经有最佳答案,请猛点这里访问。

早上好,

我是Java的新手,试图通过一个项目进行工作,但是我遇到了问题。我的程序使用SQL来构建URL来调用Web服务,该服务将返回以下JSON:

1
2
3
4
5
6
[{
   "MmisItemNo":"106552",
   "CatalogNo":"UM18840041R",
   "ContractOn":"False"
 }
]

我需要做的是最后去除" False"或" True"值,以根据其结果执行其他逻辑。

我不断收到以下错误:

1
2
.WebCall -com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot
deserialize instance of `.LightswitchResponse` out of START_ARRAY token at [Source: (String)"[{"MmisItemNo":"106552","CatalogNo":"UM18840041R","ContractOn":"False"}]"; line: 1, column: 1]

在WebCall.java类中构建URL之后,这是当前的代码:

1
2
3
4
5
6
7
8
9
10
11
12
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
    }
    in.close();
    System.out.println(response.toString());
ObjectMapper mapper = new ObjectMapper();
LightswitchResponse lightswitchResponse = mapper.readValue(response.toString(), LightswitchResponse.class);
System.out.println(lightswitchResponse.ContractOn);

在我的第二堂课中,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class LightswitchResponse {

String MmisItemNo;
String CatalogNo;
boolean ContractOn;

public String getMmisItemNo() {
    return MmisItemNo;
}
public void setMmisItemNo(String mmisItemNo) {
    MmisItemNo = mmisItemNo;
}
public String getCatalogNo() {
    return CatalogNo;
}
public void setCatalogNo(String catalogNo) {
    CatalogNo = catalogNo;
}
public boolean ContractOn() {
    return ContractOn;
}
public void setContractOn(boolean contractOn) {
    ContractOn = contractOn;
}

}

关于可能出什么问题的任何想法?我觉得这可能与JSON响应中的[]有关,但不是100%肯定。


您是对的,这是因为JSON响应上的[]。这意味着要返回的JSON对象是对象数组。

因此要让Jackson正确地映射它,您应该执行以下操作:

1
2
LightswitchResponse[] lightswitchResponses =
      mapper.readValue(response.toString(), LightswitchResponse[].class);

然后您可以从中读取第一个元素以获得所需的LightSwitchResponse对象:

1
LightswitchResponse lightswitchResponse = lightswitchResponses[0];