提问者:小点点

如何映射包含长和短成员的JSON字符串


我需要映射一个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 格式。


共3个答案

匿名用户

好吧,这显然不是解决问题的完美方案,但人们可能会发现这是一个有用的解决方法:

由于我不关心这些值,我将重命名它们的名称并相应地调整类成员的名称:

对于作为响应得到的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