3

编辑:我很困惑——使用的是 cxf,而不是球衣。有没有办法将带注释的对象转换为类似于杰克逊的 ObjectMapper 的 json?

原味精:

您好,我们目前正在使用 jaxrs 将我们的 Web 响应转换为 xml/json。然而,我现在想做的是使用 ObjectMapper(?) 在我的代码中生成一个等效的 json 字符串。

例如,给定一个控制器和带有 jaxb 注释的返回对象:

@Path("/foo")
@Produces({"application/json", "application/xml"})
public class FooController {

    @GET
    @Path("/some_action")
    public TopDTO someAction(@QueryParam("arg") String arg) {
        ...
    }
}

@XmlRootElement(name="topDTO")
@XmlAccessorType(XmlAccessType.NONE)
public class TopDTO {
    ...
    @XmlAttribute(name="attr")
    public String getAttr() {
        return "blah";
    }
    @XmlElement(name="innerDTO")
    public InnerDTO getInnerDTO() {
       ...
    }
}

@XmlRootElement(name="innerDTO")
@XmlAccessorType(XmlAccessType.NONE)
public class InnerDTO {
    ...  
}

点击http://myserver/.../foo.json会输出一些漂亮的 json:

{"topDTO":{"@attr":"blah","innerDTO":...}}

现在我希望能够在内部生成确切的 json:

ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.ALWAYS);            
mapper.getSerializationConfig().set(SerializationConfig.Feature.AUTO_DETECT_FIELDS, false);
mapper.getSerializationConfig().set(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
return mapper.writeValueAsString(snapshotDTO);

但是,这似乎根本不起作用。大多数带注释的属性和元素都丢失了,属性没有像 jaxrs 输出那样以“@”为前缀,等等。

我错过了一些简单的东西吗?jaxrs 本身如何将带注释的对象转换为 json 字符串?

谢谢!乔

4

3 回答 3

3

使用JSONJAXBContext创建编组器并使用它将您的对象序列化为 JSON 格式。我认为你不需要杰克逊。

  JSONJAXBContext c = create the context
  JSONMarshaller m = c.createJSONMarshaller();
  YourJAXBObject obj = your object
  StringWriter writer = some writer
  m.marshallToJSON(obj, writer);
于 2011-02-04T10:53:44.313 回答
2

实际上,您不仅在使用 CXF,而且还没有使用 Jackson 的 json 序列化。为什么?因为杰克逊没有在声明为属性的事物前添加“@”。

如果您想使用 ObjectMapper,您可能希望从默认值开始,并尝试根据您想要更改的内容进行更改,而不是从一组配置覆盖开始(例如:您正在禁用 getter/setter 自动检测,这似乎不是您应该做的事情)。

于 2011-02-05T06:15:03.767 回答
0

是的。可以将 Jackson 设置为提供者,如http://cxf.apache.org/docs/jax-rs-data-bindings.html 。我观察到杰克逊在很多方面都很简单方便。

于 2012-03-12T17:21:46.360 回答