泽西(+杰克逊)序列化

时间:2014-05-27 18:11:06

标签: servlets jackson java-ee-7 jersey-2.0

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

{
  "rootName": {
                "key":"value"
              }
}

问题是如何启用根级别包装,以便我可以使用@JsonRootName注释?

现在我使用rootName类包装器来获取我需要的东西但是我相信在某个地方有一些更通用的设置...将对象包装到另一个包装器对象只是为了在输出中获取它的根名称似乎不是最好的解决方案为了我。如果你能指出我更好的解决方案会很棒。

感谢您的帮助, PP

1 个答案:

答案 0 :(得分:2)

要使用@JsonRootName注释,您需要启用SerializationFeature.WRAP_ROOT_VALUE和/或DeserializationFeature.UNWRAP_ROOT_VALUE功能。这是一个例子:

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实施下运行,您需要自定义the Jackson JAX-RS JSON provider。你可以通过几种方法实现这一目标。一种选择是将对象映射器的上下文解析器注册为mentioned here。使用@JacksonFeatures注释注释资源方法的另一个选项如下:

@GET
@JacksonFeatures(serializationEnable = SerializationFeature.WRAP_ROOT_VALUE,
        deserializationEnable = DeserializationFeature.UNWRAP_ROOT_VALUE)
public Thing resourceMethod() {
    ...    
}