当前位置: 首页 > 知识库问答 >
问题:

使用jackson将JSON解析为深嵌套泛型

姬俊驰
2023-03-14

我已经试过各种方法来解决这个问题了。但没有成功。

我有几节这样的课

class Level1<T> {

    public Level2<T> l2;
}

class Level2<T> {

    public Level3<T> l3;
}

class Level3<T> {

    public List<T> objectsList;
}

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

{
    "Level1": {
        "Level2": {
            "Level3": {
                "genericObject": [
                    { 
                      "attribute1": ..., 
                      "attribute2": ...
                    },
                    { 
                      "attribute1": ..., 
                      "attribute2": ...
                    } 
                ]
            }
        }
    }
}
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真的无法将json反序列化为泛型类型吗?

共有1个答案

谭景明
2023-03-14

有几件事你需要改变

>

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

    mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
    

    您不需要为整个对象层次结构使用ConstructParametricType,只需为链中的top类构造它即可

    constructParametricType(Level1.class, genericObjectClass);
    
    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;
    }
    

  •  类似资料:
    • 问题内容: 我试图找到一种从的有效载荷中解析嵌套属性的干净方法。 这是有效负载的粗略概括: 我的目标是拥有具有和字段的对象数组。 有人知道干净地解析此内容的好方法吗? 现在,我正在尝试创建一个类,并在其中创建一个用于数据,值,用户等的静态内部类。 我用来呼叫端点。 问题答案: 您需要使用JsonPath库,该库仅允许您选择必填字段,然后可以将原始数据转换为类。解决方案示例如下所示: 上面的代码打印

    • 我能够使用类解析嵌套json字符串。这里的问题是,解析嵌套json变得越来越困难,因为我不得不编写大量样板代码来实现将json解析为java对象的最终结果。在spring中,除了这种方法之外,还有什么更好的解析方法吗? 域类: 组件类 属性类: 控制器类: json文件: 如前所述,解析可以使用实例完成,但要使用大量样板代码和硬编码json元素名。有没有更好的办法?我使用库解析json文件。 我参

    • 我已经编写了糟糕的代码来解析上面的json数组。下面是我使用的代码, 有谁能帮助我知道使用Jackson解析JSON吗?我们非常感谢你的帮助。

    • 问题内容: 我正在尝试从上述JSON检索邮政编码。我正在用gson解析它。我是JSON的新手,从我在这里的所有文章中读到的内容(有些与此类似),我都知道字段名称应保持原样。所以我知道我必须做出4类,即响应,视图,结果和地址。我使它们成为静态嵌套类,但是我只得到空值作为输出。在下一个JSON中,我有多个地址。但是我只停留在这个单一的回应上。 举一个简短的例子,我尝试使用此代码检索Timestamp,

    • 我想做的是使用Gson将嵌套的json数据解析为Java对象,并使用自定义的toString()将其打印出来。 Json内容 POJO类:示例 POJO类:JsonFormatter 我的POJO还有其他类,我试图将其解析为Gson的方式是: 但是当我试图打印出它的子值时,比如 我得到了错误: 我想实现的是将上面的json内容打印成这样: 谁能帮我解决这个问题吗?提前谢谢!

    • 我正在编写一个接收SQS队列对象的Lambda函数。SQS将json对象作为字符串值发送给SQS。 当我在Lambda中接收到请求时,AWS已经将其包装成一个新的JSON,由于JSON是一个字符串值,因此它将成为无效的JSON。 现在body.message不是有效的JSON。我尝试将它解析为一个原始值,比如如何使用Jackson在对象中包含原始JSON?但它总是抱怨,它在期待逗号分隔对象的地方找