Servlets 泽西(杰克逊)系列化
我使用的是Jersey框架,com.fasterxml.jackson是默认序列化程序。我试图返回具有指定根名称的json对象。e、 g:Servlets 泽西(杰克逊)系列化,servlets,jackson,java-ee-7,jersey-2.0,Servlets,Jackson,Java Ee 7,Jersey 2.0,我使用的是Jersey框架,com.fasterxml.jackson是默认序列化程序。我试图返回具有指定根名称的json对象。e、 g: { "rootName": { "key":"value" } } 问题是如何启用根级别包装,以便使用@JsonRootName注释 现在我正在使用rootName类包装器来获得我需要的东西,但是我相信在某些地方有一些更通用的设置。。。将对象包装到另一个包装器对象中只是为了在输出中获得其根名称
{
"rootName": {
"key":"value"
}
}
问题是如何启用根级别包装,以便使用@JsonRootName注释
现在我正在使用rootName类包装器来获得我需要的东西,但是我相信在某些地方有一些更通用的设置。。。将对象包装到另一个包装器对象中只是为了在输出中获得其根名称,这似乎不是我的最佳解决方案。如果你能告诉我更好的解决方案,那就太好了
谢谢你的帮助,
PP要使用
@JsonRootName
注释,您需要启用序列化功能。包装根值和/或反序列化功能。展开根值
功能。以下是一个例子:
public class JacksonWrapped {
final static String JSON = "{\n" +
" \"rootName\": {\n" +
" \"key\":\"value\"\n" +
" }\n" +
"}";
@JsonRootName("rootName")
public static class Thing {
public final String key;
@JsonCreator
public Thing(@JsonProperty("key") String key) {
this.key = key;
}
@Override
public String toString() {
return "Thing{" +
"key='" + key + '\'' +
'}';
}
}
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
System.out.println(mapper.writeValueAsString(new Thing("value")));
System.out.println(mapper.readValue(JSON, Thing.class));
}
}
输出:
{"rootName":{"key":"value"}}
Thing{key='value'}
要使其在JAX-RS实现下工作,您需要定制。你几乎没有办法做到这一点。一个选项是将对象映射器的上下文解析器注册为。使用@JacksonFeatures
注释资源方法的另一个选项如下:
@GET
@JacksonFeatures(serializationEnable = SerializationFeature.WRAP_ROOT_VALUE,
deserializationEnable = DeserializationFeature.UNWRAP_ROOT_VALUE)
public Thing resourceMethod() {
...
}