强制杰克逊使用注释添加附加包装 [英] Force Jackson to add addional wrapping using annotations

查看:164
本文介绍了强制杰克逊使用注释添加附加包装的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下课程:

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆