我需要映射一个JSON字符串,其中包括名为long和low的值:
"status": {
"long": "Finished",
"short": "F",
"elapsed": 90
}
我尝试了以下课程:
public class Status {
@JsonProperty("long")
public String _long;
@JsonProperty("short")
public String _short;
@JsonProperty("elapsed")
public Object elapsed;
}
使用命令:
objectMapper.readValue(resBody, Response.class);
响应包含状态部分:
{
"response": {
"id": 157016,
"timezone": "UTC",
"date": "2019-08-10T11:30:00+00:00",
"timestamp": 1565436600,
"status": {
"long": "Long Value",
"short": "LV",
"elapsed": 20
}
}
}
但是我仍然得到下面的错误:
com . faster XML . Jackson . databind . exc . Unrecognized property exception:无法识别的字段“long”
如何解决这个问题?我无法控制 JSON 格式。
好吧,这显然不是解决问题的完美方案,但人们可能会发现这是一个有用的解决方法:
由于我不关心这些值,我将重命名它们的名称并相应地调整类成员的名称:
对于作为响应得到的json字符串resBody,我将执行以下操作
@NotNull
private static String mitigateLongAndShortValueNames(String resBody) {
resBody = resBody.replaceAll("\"long\":", "\"longValue\":");
resBody = resBody.replaceAll("\"short\":", "\"shortValue\":");
return resBody;
}
和改变
public class Status {
@JsonProperty("long")
public String _long;
@JsonProperty("short")
public String _short;
@JsonProperty("elapsed")
public Object elapsed;
}
到
public class Status {
public String longValue;
public String shortValue;
public Object elapsed;
}
这对我有用!
解决问题的方法之一是结合将json转换为< code>JsonNode对象的< code > object mapper # read tree 方法,选择您感兴趣的json部分,然后使用与< code>/response/status路径表达式匹配的< code>JsonNode方法选择您要查找的< code > JSON node 对象部分,如下所示:
//it contains only the status labelled node of your json
JsonNode statusNode = mapper.readTree(json).at("/response/status");
在使用 ObjectMapper#treeToValue
方法将 JsonNode
转换为 Status
类获得预期结果后:
JsonNode statusNode = mapper.readTree(json).at("/response/status");
Status status = mapper.treeToValue(statusNode, Status.class);
//ok, it prints {"long":"Long Value","short":"LV","elapsed":20}
System.out.println(mapper.writeValueAsString(status));
完整的异常消息应如下所示:< code > com . faster XML . Jackson . databind . exc . Unrecognized property exception:无法识别的字段“long”(类...),未标记为可忽略(n个已知属性:...)
如果您对某些属性不感兴趣,那么在解析过程中< code >忽略这些属性会更容易、更干净。使用数据类上的注释或对象映射器上的反序列化功能。
参见Jackson with JSON:无法识别的字段,未标记为ignorable