【问题标题】:Wrapper Method for ObjectMapper which accepts String and class as arguement接受字符串和类作为参数的 ObjectMapper 的包装器方法
【发布时间】:2023-01-20 14:56:31
【问题描述】:

您好,我正在将所有与 FasterXml 相关的代码移动到一个地方。所以我正在编写一个类似下面的包装器方法,它在很多地方都使用过。

public static <T> T convertToObject(String json, Class clazz){
return objectMapper.read(json, new TypeReference<clazz>(){}; 

这样上面的方法就可以在下面的很多地方使用

List<Foo> fooList=convertToObject(jsonString,List<Foo>);
Map<Foo> fooMap=convertToObject(jsonString,Map<Foo>);
Boo<List<Foo>> booList=convertToObject(jsonString,Boo<List<Foo>>);
etc

这个 clazz 可以是 List&lt;POJO&gt;Map&lt;POJO&gt;POJO&lt;LIST&lt;POJO&gt;&gt; 等。但是在上面的 convertToObject 方法中,new TypeReference&lt;clazz&gt;(){} 的语法是不正确的。

请帮助我编写像上面这样的 util/wrapper 方法,它以字符串 Payload 和一些类作为参数,并在反序列化后返回对象。

【问题讨论】:

  • 是不正确的方法?你能描述一下不正确的地方吗?

标签: java deserialization fasterxml


【解决方案1】:

尝试使用这个实用程序类

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonSerializer<T> {

    final Class<T> typeParameterClass;

    public JsonSerializer(Class<T> typeParameterClass) {
        this.typeParameterClass = typeParameterClass;
    }

    public T deserialize(String json) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(json, typeParameterClass);
    }
}

然后你可以像这样使用它:

JsonSerializer<Clazz> serializer = new JsonSerializer<>(Clazz.class);
var dto = serializer.deserialize(someJson);

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2021-04-12
    • 2020-04-02
    • 2012-06-25
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多