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

Java-用ObjectMapper反序列化为动态嵌套泛型类型

丁曦哲
2023-03-14

我正在编写一个通用的JSON反序列化,使用ObjectMapper(com.fasterxml.Jackson库的)函数接收对象类型和集合/映射类型作为参数。

// Reading a single object from JSON String
public static <T> Object readObjectFromString(String string, Class<T> type) {
    try {
            return objectMapper.readValue(string, type);
    } catch (Exception e) {
            e.printStackTrace();
            return null;
    }
}

// Reading a Collection object from JSON String
public static <T> Object readCollectionObjectsFromString(String string,  Class<? extends Collection> collectionType, Class<T> type) {
    try {
            CollectionType typeReference =
                    TypeFactory.defaultInstance().constructCollectionType(collectionType, type);
            return objectMapper.readValue(string, typeReference);
    } catch (Exception e) {
            e.printStackTrace();
            return null;
    }
}

// Reading a Map object from JSON String
public static <T> Object readCollectionObjectsFromString(String string, Class<? extends Map> mapType, Class<T> keyType, Class<T> valueType) {
    try {
            MapType typeReference =
                    TypeFactory.defaultInstance().constructMapType(mapType, keyType, valueType);
            return objectMapper.readValue(string, typeReference);
    } catch (Exception e) {
            e.printStackTrace();
            return null;
    }
}
Map<A,List<Map<B,C>>> nestedGenericObject1
List<Map<A,B>> nestedGenericObject2
Map<List<A>,List<B>> nestedGenericObject3
// etc...

共有1个答案

袁玮
2023-03-14

您可以使用typereference :

java prettyprint-override">TypeReference<Map<A, List<Map<B, C>>>> typeReference = 
        new TypeReference<Map<A, List<Map<B, C>>>>() {};
Map<A, List<Map<B, C>>> data = mapper.readValue(json, typeReference);

如果要将其封装在一个方法中,可以使用一个方法,例如:

public <T> T parse(String json, TypeReference<T> typeReference) throws IOException {
    return mapper.readValue(json, typeReference);
}
TypeReference<Map<A, List<Map<B, C>>>> typeReference = 
        new TypeReference<Map<A, List<Map<B, C>>>>() {};
Map<A, List<Map<B, C>>> data = parse(json, typeReference);
 类似资料:
  • 给定这样一个类 如何实现可以处理嵌套泛型类型的自定义Kafka反序列化器? 附注:我正在使用jackson进行序列化/反序列化。

  • 我正在尝试使用Jakson反序列化一个嵌套的多态类型。也就是说,我的顶级类型引用了另一个多态类型,该类型最终由不抽象的类扩展。这不起作用,它会抛出一个异常。 下面是我尝试做的一个简化的例子。 我得到了关于抽象类型的标准异常。 让我解释一下我的用例。我有一个描述数据工作流的Json文档。我在“Level One”有一个抽象类型,描述对单个值的操作。我派生了一堆不是抽象的类,它们实现了公共操作(我用@

  • 问题内容: 我正在尝试使用Jakson反序列化嵌套的多态类型。意思是我的顶级类型引用了另一个多态类型,该类型最终由不是抽象的类扩展。这不起作用,并引发异常。 这是我要尝试做的简化示例。 我得到有关抽象类型的标准例外。 让我解释一下我的用例。我有一个描述数据工作流程的Json文档。我在“一级”有一个抽象类型,描述了对单个值的操作。我派生了一堆不是抽象的类,它们实现了常见的操作(我用@JsonSubT

  • 问题内容: 我正在尝试制作一个使用Jackson来反序列化POJO的类。 看起来像这样… 我对此实施有2个问题。 首先是我将类类型传递给方法,以便对象映射器知道应反序列化的类型。有使用泛型的更好方法吗? 同样在get方法中,我将一个从objectMapper返回的对象强制转换为T。这看起来特别讨厌,因为我必须在此处强制转换T,然后还必须从调用它的方法中强制转换对象类型。 我在该项目中使用了Robo

  • 我在Android应用程序中实现Json反序列化时遇到了一些问题(带有Gson库)