jackson 在运行时用任何类反序列化JSON

v7pvogib  于 10个月前  发布在  其他
关注(0)|答案(1)|浏览(59)

我有一个Kafka消费者库,它消费一个字节数组。我的上游总是将JSON字符串发布为字节。在消费和转换为字符串时,我需要能够将其反序列化为一个类,这个类对于不同的消费者来说是不同的。
以下是我尝试反序列化的方式

public class MessageUtil<T> {

    public T deserializeByStringConversion(final byte[] message) throws Exception {
        String json = IOUtils.toString(message);
        return new ObjectMapper().readValue(json, new TypeReference<T>() {});
    }
}

字符串
下面是我如何尝试调用它

MessageUtil<MyClass> messageUtil;

    @BeforeClass
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMyClass() throws Exception {
        MyClass myClass = messageUtil.deserializeByStringConversion(IOUtils.toByteArray(request));
        Assert.assertNotNull(myClass);
    }


这将引发以下异常-
java.lang.ClassCastException:java.util.LinkedHashMap不能强制转换为com.a.b.c.d.MyClass
我有多个消费者在不同的类上工作,其中MyClass将是不同的。我如何编写这个反序列化器来处理泛型类型?

umuewwlo

umuewwlo1#

例如,您应该将类型信息作为deserializeByStringConversion签名传递。

public class MessageUtil<T> {

    public T deserializeByStringConversion(final byte[] message, TypeReference<T> valueTypeRef) throws Exception {
        String json = IOUtils.toString(message);
        return new ObjectMapper().readValue(json, valueTypeRef);
    }
}

个字符

相关问题