【问题标题】:Converting JSON to a java object using Jackson [duplicate]使用 Jackson 将 JSON 转换为 java 对象 [重复]
【发布时间】:2018-07-19 05:59:10
【问题描述】:

早安,

我对 java 比较陌生,并试图完成一个项目,但我遇到了问题。我的程序使用 SQL 构建 URL 来调用 Web 服务,该服务将返回以下 JSON:

[{
    "MmisItemNo": "106552",
    "CatalogNo": "UM18840041R",
    "ContractOn": "False"
 }
]

我需要做的是去掉最后的“假”或“真”值,根据结果做额外的逻辑。

我不断收到以下错误:

.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 后的代码:

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);

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

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% 确定。

【问题讨论】:

  • 我收到了您的错误消息,删除了所有自定义内容,并在 google 上进行了搜索。该副本是第一个结果。请养成在发布问题之前这样做的习惯。见How much research effort is expect of StackOverflow users?
  • 对不起,我不知道自从我使用杰克逊以来,我的情况是否有所不同。我会在下一篇文章之前做更多的研究,谢谢!

标签: java json


【解决方案1】:

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

因此,要让 Jackson 正确映射它,您应该这样做:

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

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

LightswitchResponse lightswitchResponse = lightswitchResponses[0];

【讨论】:

  • 感谢您的回复,当我尝试使用该附加行时出现此错误:表达式的类型必须是数组类型,但它解析为 LightswitchResponse
  • 我错过了第二行的一个 s 我现在修好了。
  • 谢谢,现在错误变为:无法识别的字段“MmisItemNo”(c.LightswitchResponse),未标记为可忽略(3 个已知属性:“contractOn”、“catalogNo”、“mmisItemNo”]) [来源:(String)"[{"MmisItemNo":"106552","CatalogNo":"UM18840041R","ContractOn":"False"}]";行:1,列:17](通过引用链:java.lang.Object[][0]
  • 在你的第一个代码上方添加了这个:mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  • 现在可以使用了,谢谢!
猜你喜欢
  • 2013-03-25
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 2012-08-03
  • 2017-02-04
相关资源
最近更新 更多