首页 文章

Jackson JSON解析,如何将2个可能的对象映射到一个主对象中

提问于
浏览
0

我正在使用Jboss Resteasy和Jackson来对一个物体进行反应 . 问题是我连接的API要么返回一个A类型的对象,如果它是一个错误,要么返回类型B的对象列表,如果它成功的话 . 我的目标是让对象C如下所示:

class C {
   A a;
   List<B> bList;
}

但是,当我尝试这个时,我得到(在它返回成功的情况下)

Caused by: org.codehaus.jackson.map.JsonMappingException: Failed to narrow content type [collection type; class java.util.List, contains [simple type, class com.B]] with content-type annotation (com.C): Class com.C is not assignable to com.B
at org.codehaus.jackson.map.deser.BasicDeserializerFactory.modifyTypeByAnnotation(BasicDeserializerFactory.java:797)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.constructSettableProperty(BeanDeserializerFactory.java:1375)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:1182)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:707)

我只是不确定我需要什么样的@Json注释(或者即使这可能)

1 回答

  • 0

    你将无法像那样整理它 . RestEasy将查看您的 class C ,它将无法确定您的响应对象是否包含 class AList<B> .

    你可以像这样解决这类交易:

    public <T> T returnEntityIfValid(ClientResponse response, Class clazz) {
        try {
            return (T) response.getEntity(clazz);
        } catch (RuntimeException ex) {
            final A node = (A) response.getEntity(A.class);
            throw new RuntimeException("ERROR: " + node.toString());
        }
    }
    

    这个想法是我们期待一个指定的类型,但由于 Response 对象模糊了我们,我们必须尝试 grab 实体 . 如果响应对象包含您的实体 class A ,它将返回它没有问题 . 否则,它将尝试提取它,但抛出 JsonMappingException (不能从 Response.getEntity() 抛出 RuntimeException ),此时将从 class B 中提取错误

    这已被广泛用于支持任何实体类型的类提取 .

相关问题