强制jackson使用注释添加附加包装

我有以下课程:

public class Message { private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } } 

在默认情况下使用Jackson将实例转换为JSON时,我得到:

 {"text":"Text"} 

我想得到:

 {"message":{"text":"Text"}} 

是否有任何JAXB / Jackson注释可用于实现我的目标?

作为一种解决方法,我可以用另一个类包装我的类:

 public class MessageWrapper { private Message message; public Message getMessage() { return message; } public void setMessage(Message message) { this.message = message; } } 

或更通用的解决方案:

 public class JsonObjectWrapper { /** * Using a real map to allow wrapping multiple objects */ private Map wrappedObjects = new HashMap(); public JsonObjectWrapper() { } public JsonObjectWrapper(String name, T wrappedObject) { this.wrappedObjects.put(name, wrappedObject); } @JsonAnyGetter public Map any() { return wrappedObjects; } @JsonAnySetter public void set(String name, T value) { wrappedObjects.put(name, value); } } 

哪个可以这样使用:

 Message message = new Message(); message.setText("Text"); JsonObjectWrapper wrapper = new JsonObjectWrapper("message", message); 

是否有任何JAXB / Jackson注释可用于实现我的目标?

谢谢。

解决方法:你并不一定需要那些getter / setter,所以可能只有:

 public class MessageWrapper { public Message message; } 

或者可能添加便利构造函数:

 public class MessageWrapper { public Message message; @JsonCreator public MessageWrapper(@JsonProperty("message") Message m) { message = m; } } 

还有一种方法可以添加包装; 使用1.9,您可以使用SerializationConfig.Feature.WRAP_ROOT_ELEMENTDeserializationConfig.Feature.UNWRAP_ROOT_ELEMENT 。 如果你想更改包装器名称(默认情况下它只是非限定类名),你可以使用@JsonRootName注释

Jackson 2.0通过ObjectReaderObjectWriter以及JAX-RS注释添加了更多动态选项。

令人遗憾的是,您必须编写自定义序列化,以实现使用带标签的对象包装类的简单目标。 在编写自定义序列化程序后,我得出结论,最简单的解决方案是通用包装器。 这可能是上面示例的一个更简单的实现:

 public final class JsonObjectWrapper { private JsonObjectWrapper() {} public static  Map withLabel(String label, E wrappedObject) { HashMap map = new HashMap(); map.put(label, wrappedObject); return map; } } 

如果您不介意json在message@JsonTypeInfo m ,那么最简单的方法是使用@JsonTypeInfo注释您的类。

你会添加:

 @JsonTypeInfo(include=As.WRAPPER_OBJECT, use=Id.NAME) public class Message { // ... } 

得到{"Message":{"text":"Text"}}

更简单/更好的方法:

 @JsonRootName(value = "message") public class Message { ...} 

然后用
new ObjectMapper().configure(SerializationFeature.WRAP_ROOT_VALUE, true).writeValueAs...

如果使用spring,则在application.properties文件中添加以下内容: –

spring.jackson.serialization.WRAP_ROOT_VALUE =真

然后在您要序列化的任何类上使用@JsonRootName批注。 例如

 @JsonRootName("user") public class User { private String name; private Integer age; }