Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson-使用多种类型处理JSON_Java_Json_Jackson - Fatal编程技术网

Java Jackson-使用多种类型处理JSON

Java Jackson-使用多种类型处理JSON,java,json,jackson,Java,Json,Jackson,假设我有一个JSON文件,如下所示: { "response" : [ { "id" : "10", "period" : "month", "values" : [ { "value" : 100, "date" : "2013-05-10" } ], "parent" : "1"

假设我有一个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*/
         }
    }
}

这是可行的,但是有没有比仅仅使用“对象”来保存“值”更好的方法呢?因为“值”可以是单个值,也可以是对象,所以我很难弄清楚它应该是什么。我肯定有一种多态的处理方法,但我已经看过了,没有找到任何有效的方法。我被卡住了,非常感谢您的帮助。

不幸的是,对于您正在处理的JSON的结构,反序列化它的唯一方法是将
属性设置为type
Object
。但是,一旦JSON被反序列化,您就可以很容易地确定
value
是对象还是单个值

请注意,JSON只支持五种数据类型:对象(java中的映射)、数组、字符串、数字和布尔值。在您的例子中,
很可能是一个数字或数字地图;那么你有两种可能要检查。使用快速的
实例进行比较,您应该能够找出它是什么类型的值

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

实际上,您可以使用
JsonDeserializer
。看看如何实现这一目标:
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