Servlets 泽西(杰克逊)系列化

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类包装器来获得我需要的东西,但是我相信在某些地方有一些更通用的设置。。。将对象包装到另一个包装器对象中只是为了在输出中获得其根名称

我使用的是Jersey框架,com.fasterxml.jackson是默认序列化程序。我试图返回具有指定根名称的json对象。e、 g:

{
  "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() {
    ...    
}