【问题标题】:Jackson - Processing JSON with multiple typesJackson - 处理多种类型的 JSON
【发布时间】:2013-06-21 03:27:28
【问题描述】:

假设我有一个如下所示的 JSON 文件:

{
"response" : [
    {
        "id" : "10",
        "period" : "month",
        "values" : [
             {
                 "value" : 100,
                 "date" : "2013-05-10"
             }
        ],
        "parent" : "1"
    },
    {
        "id" : "10",
        "period" : "day",
        "values" : [
             {
                 "value" : {
                        "foo" : 10,
                        "bar" : 11,
                        "etc" : 4
                 },
                 "date" : "2013-05-10"
             }
        ],
        "parent" : "1"
    },{
        "id" : "13",
        "period" : "year",
        "values" : [
             {
                 "value" : {
                        "info" : 1,
                        "pages" : 10,
                        "etc" : 4
                 },
                 "date" : "2013-05-10"
             }
        ],
        "parent" : "1"
    }
]
}

请注意,“值”部分可以是单个值,也可以是对象(唯一的)。

我想使用 Jackson ObjectMapper 轻松地将其映射到 POJO。

到目前为止我所拥有的:

public class Response
{
    List<ResponseEntry> response;
    /*getters + setters */

    public static class ResponseEntry
    {
         private String id;
         private String period;
         private String parent;
         private List<Value> values;
         /*setters + getters*/

         public static class Value
         {
             private Object value;
             private String date;
             /*setters+getters*/
         }
    }
}

为了映射响应,我只需指定我想要的文件并告诉 ObjectMapper 映射到“响应”类

ObjectMapper mapper = new ObjectMapper();
Response r = mapper.readValues(json, Response.class);

这可行,但有没有比仅使用“对象”来保存“价值”更好的方法?由于“值”可以是单个值或对象,所以我很难弄清楚它应该是什么。我确信有一种多态的方式来处理这个问题,但我已经看过并且找不到任何有效的方法。我很困惑,如果有任何帮助,我将不胜感激。

【问题讨论】:

标签: java json jackson


【解决方案1】:

不幸的是,对于您正在处理的 JSON 的结构,反序列化它的唯一方法是将 value 属性类型为 Object。但是,一旦 JSON 被反序列化,您就可以轻松判断 value 是一个对象还是单个值。

请注意,JSON 仅支持五种数据类型:对象(Java 中的 Map)、数组、字符串、数字和布尔值。在您的情况下,value 很可能是一个数字或数字映射;那么你有两种可能检查。使用快速的instanceof 比较,您应该能够弄清楚它是什么类型的值。

ObjectMapper mapper = new ObjectMapper();
Response r = mapper.readValues(json, Response.class);
Value val = r.response.get(0).values.get(0);
if (val.value instanceof Map)
    ; // multiple
else
    ; // single

【讨论】:

    猜你喜欢
    • 2019-07-01
    • 2023-03-10
    • 2014-12-11
    • 2015-09-25
    • 2018-09-07
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多