Java 如何精确匹配来自cxf的json输出?

Java 如何精确匹配来自cxf的json输出?,java,json,cxf,jax-rs,jackson,Java,Json,Cxf,Jax Rs,Jackson,编辑:我很困惑——我们使用的是cxf,而不是jersey。有没有一种方法可以将带注释的对象转换为类似于jackson的ObjectMapper的json 原味味精: 嗨, 我们目前正在使用JAXR将web响应转换为xml/json。然而,我现在想做的是使用ObjectMapper(?)在代码中生成一个等效的json字符串 例如,给定一个控制器和带jaxb注释的返回对象: @Path("/foo") @Produces({"application/json", "application/xml"}

编辑:我很困惑——我们使用的是cxf,而不是jersey。有没有一种方法可以将带注释的对象转换为类似于jackson的ObjectMapper的json

原味味精:

嗨, 我们目前正在使用JAXR将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 {
    ...  
}
打出来一些漂亮的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字符串

谢谢! joe

使用to将对象序列化为JSON格式。我认为你不需要杰克逊

  JSONJAXBContext c = create the context
  JSONMarshaller m = c.createJSONMarshaller();
  YourJAXBObject obj = your object
  StringWriter writer = some writer
  m.marshallToJSON(obj, writer);

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


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

是的。可以将Jackson设置为中的提供商
. 我观察到杰克逊在很多方面都很简单和方便。

我怀疑你能否做到这一点。Jersey和Jackson的工作方式非常不同,产生不同风格的JSON。您最好使用Jersey以编程方式生成JSON。不幸的是,我有点困惑。结果是使用的是cxf,而不是jersey(您是否找到了此问题的解决方案?是正确的。CXF的默认JSON序列化程序是弃用的,它添加了@符号。Jackson没有。但是,您可以使用一些Spring xml配置将Jackson设置为默认值: