繁体   English   中英

用杰克逊解析JSON到深度嵌套的泛型

[英]Parse JSON to deeply nested generic with jackson

我一直在尝试各种解决方案以使其正常工作。 但是没有成功。

我有几个这样的课程

class Level1<T> {

    public Level2<T> l2;
}

class Level2<T> {

    public Level3<T> l3;
}

class Level3<T> {

    public List<T> objectsList;
}

在这种情况下, T 可以是任何对象 ,并且应该可以在运行时解析

我的JSON看起来像这样:

{
    "Level1": {
        "Level2": {
            "Level3": {
                "genericObject": [
                    { 
                      "attribute1": ..., 
                      "attribute2": ...
                    },
                    { 
                      "attribute1": ..., 
                      "attribute2": ...
                    } 
                ]
            }
        }
    }
}

JSON属性“ genericObject”根据我要接收的对象类型更改其名称和属性。

我尝试像这样在ObjectMapper中进行定义,在其中将Class对象传递给函数(genericObjectClass):

JavaType javaType = TypeFactory.defaultInstance().constructParametricType(ArrayList.class, List.class, genericObjectClass);
javaType = TypeFactory.defaultInstance().constructParametricType(Level3.class, javaType);
javaType = TypeFactory.defaultInstance().constructParametricType(Level2.class, javaType);
javaType = TypeFactory.defaultInstance().constructParametricType(Level1.class, javaType);

Level1<genericObject> l1 = objectMapper.readValue(jsonString, javaType);

尝试过的解决方案:

杰克逊的(反)序列化嵌套泛型

如何在泛型中使用Jackson

Jackson真的无法将json反序列化为通用类型吗?

您需要更改几件事

  1. Level1对象不是根对象,而是一个字段。 如果您不想再创建一个包装对象,请使用UNWRAP_ROOT_VALUE

     mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 
  2. 你并不需要constructParametricType整个对象层次结构,只是构建它顶级链

     constructParametricType(Level1.class, genericObjectClass); 
  3. 您的json字段不会映射到pojo字段。 因此,您需要使用@JsonProperty("Level2") @JsonProperty("genericObject")来注释POJO字段。

所以您的反序列化代码应该看起来像

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);

JavaType javaType = TypeFactory.defaultInstance()
         .constructParametricType(Level1.class, c);

mapper.readValue(json, javaType);

和类看起来像

class Level1<T> {
    @JsonProperty("Level2")
    public Level2<T> l2;
}
class Level2<T> {
    @JsonProperty("Level3")
    public Level3<T> l3;
}
class Level3<T> {
    @JsonProperty("genericObject")
    public List<T> objectsList;
}

这是完整的工作原理演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM