强制杰克逊使用注释添加附加包装 [英] Force Jackson to add addional wrapping using annotations
问题描述
我有以下课程:
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(消息消息){
this.message = message;
}
}
或更通用的解决方案:
公共类JsonObjectWrapper< T> {
/ **
*使用实际地图允许包装多个对象
* /
private Map< String,T> wrappedObjects = new HashMap< String,T>();
public JsonObjectWrapper(){
}
public JsonObjectWrapper(String name,T wrappedObject){
this.wrappedObjects.put(name,wrappedObject) ;
}
@JsonAnyGetter
公共地图< String,T> any(){
return wrappedObjects;
}
@JsonAnySetter
public void set(String name,T value){
wrappedObjects.put(name,value);
}
}
可以这样使用:
消息消息= new Message();
message.setText(Text);
JsonObjectWrapper< Message> wrapper = new JsonObjectWrapper< Message>(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_ELEMENT
和 DeserializationConfig.Feature.UNWRAP_ROOT_ELEMENT
。如果你想更改包装器名称(默认情况下它只是不合格的类名),你可以使用 @JsonRootName
注释
Jackson 2.0通过 ObjectReader
和 ObjectWriter
以及JAX-RS注释添加了更多动态选项。 / p>
I have the following class:
public class Message {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
When converting the instance to JSON using Jackson by default I get:
{"text":"Text"}
I would like to get:
{"message":{"text":"Text"}}
Is there any JAXB / Jackson annotation I can use to achieve my goal?
As a workaround, I can wrap my class with another class:
public class MessageWrapper {
private Message message;
public Message getMessage() {
return message;
}
public void setMessage(Message message) {
this.message = message;
}
}
or a more generic solution:
public class JsonObjectWrapper<T> {
/**
* Using a real map to allow wrapping multiple objects
*/
private Map<String, T> wrappedObjects = new HashMap<String, T>();
public JsonObjectWrapper() {
}
public JsonObjectWrapper(String name, T wrappedObject) {
this.wrappedObjects.put(name, wrappedObject);
}
@JsonAnyGetter
public Map<String, T> any() {
return wrappedObjects;
}
@JsonAnySetter
public void set(String name, T value) {
wrappedObjects.put(name, value);
}
}
Which can be used like so:
Message message = new Message();
message.setText("Text");
JsonObjectWrapper<Message> wrapper = new JsonObjectWrapper<Message>("message", message);
Is there any JAXB / Jackson annotation I can use to achieve my goal?
Thanks.
On workaround: you don't absolutely need those getters/setters, so could just have:
public class MessageWrapper {
public Message message;
}
or perhaps add convenience constructor:
public class MessageWrapper {
public Message message;
@JsonCreator
public MessageWrapper(@JsonProperty("message") Message m) {
message = m;
}
}
There is a way to add wrapping too; with 1.9 you can use SerializationConfig.Feature.WRAP_ROOT_ELEMENT
and DeserializationConfig.Feature.UNWRAP_ROOT_ELEMENT
. And if you want to change the wrapper name (by default it is simply unqualified class name), you can use @JsonRootName
annotation
Jackson 2.0 adds further dynamic options via ObjectReader
and ObjectWriter
, as well as JAX-RS annotations.
这篇关于强制杰克逊使用注释添加附加包装的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!