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

时间:2013-08-18 07:37:55

标签: json jackson resteasy

我正在使用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 :(得分: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对象模糊了我们,我们必须尝试抓住实体。如果响应对象包含您的实体class A,它将返回它没有问题。否则,它将尝试提取它,但抛出JsonMappingException(不能从Response.getEntity()抛出RuntimeException),此时将从{{1}中提取错误}}

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