强制杰克逊使用注释添加附加包装

Mos*_*sha 15 java jackson

我有以下课程:

public class Message {
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }    
}
Run Code Online (Sandbox Code Playgroud)

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

{"text":"Text"}
Run Code Online (Sandbox Code Playgroud)

我想得到:

{"message":{"text":"Text"}}
Run Code Online (Sandbox Code Playgroud)

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

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

public class MessageWrapper {
    private Message message;

    public Message getMessage() {
        return message;
    }

    public void setMessage(Message message) {
        this.message = message;
    }
}
Run Code Online (Sandbox Code Playgroud)

或更通用的解决方案:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个可以这样使用:

Message message = new Message();
message.setText("Text");
JsonObjectWrapper<Message> wrapper = new JsonObjectWrapper<Message>("message", message);
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Sta*_*Man 13

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

public class MessageWrapper {
  public Message message;
}
Run Code Online (Sandbox Code Playgroud)

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

public class MessageWrapper {
  public Message message;
  @JsonCreator
  public MessageWrapper(@JsonProperty("message") Message m) { 
       message = m; 
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Jackson 2.0通过ObjectReaderObjectWriterJAX-RS注释添加了更多动态选项.


Rau*_*ava 6

在Jackson 2.x中,可以使用以下命令启用包装程序,而无需在ObjectMapper中添加其他属性

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;

@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
@JsonTypeName(value = "student")
public class Student {
  private String name;
  private String id;
}
Run Code Online (Sandbox Code Playgroud)