Java&Json:序列化时包装元素
只是想知道是否有办法做到这一点 – 我有一个类,类似于
class MyClass { private String name; private String address; private String number; }
当我使用Jackson将它序列化为Json时,我想将String变量包装在一起,所以它看起来像
{ "Strings": { "name" : "value", "address" : "value" } }
没有将这些变量包装在MyClass中的List或Map类中……这可能吗?
你也可以在你的POJO课程中为“Strings”,“Intigers”等添加额外的getter。这些方法应该返回Map
的结果。 考虑下面的代码:
import java.util.LinkedHashMap; import java.util.Map; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonProgram { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); MyClass myClass = new MyClass(); myClass.setAddress("New York, Golden St. 1"); myClass.setName("James Java"); myClass.setNumber("444"); System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(myClass)); } } class MyClass { private String name; private String address; private String number; @JsonIgnore public String getName() { return name; } public void setName(String name) { this.name = name; } @JsonIgnore public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @JsonIgnore public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } @JsonProperty(value = "Strings") public Map getStrings() { Map map = new LinkedHashMap(); map.put("name", getName()); map.put("address", getAddress()); map.put("number", getNumber()); return map; } }
结果:
{ "Strings" : { "name" : "James Java", "address" : "New York, Golden St. 1", "number" : "444" } }
这可能是您可以使用的最优雅的解决方案,但它很简单。
jackson利用你的类结构来决定json结构。 如果需要将类属性包装在另一个属性中,则需要考虑包装。 如果您不需要,则无需创建集合。 只需将名称和地址放在不同的类中,并根据您的包装名称命名该类。 然后在MyClass中添加包装类的实例。
我使用JsonSerializer
为Spring做这个,非常简单。
您创建一个扩展JsonSerializer
的类
像这个:
public class ServerResposeSerializer extends JsonSerializer
{ @Override public void serialize(ServerResponse objectWrapper, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException { generator.writeStartObject(); generator.writeNumberField("http_status", objectWrapper.getStatus().value()); generator.writeStringField("message",objectWrapper.getMessage()); generator.writeArrayFieldStart("objects"); List> objects = objectWrapper.getObjects(); for (Object object: objects) { generator.writeObject(object); } generator.writeEndArray(); generator.writeEndObject(); } }
用。注释ServerResponse
@JsonSerialize (using = ServerResposeSerializer.class)
现在,您可以格式化要生成任何类型的JSON字符串的任何类
有点老问题,但在寻找同一问题的解决方案时,我遇到了这个答案 。
通过使用writer()
函数从ObjectMapper
创建ObjectWriter
,然后为映射设置rootName
MyClass myclass = new MyClass() myclass.setName("a"); myclass.setAddress("b"); ObjectMapper mapper = new ObjectMapper(); ObjectWriter writer = mapper.writer().withRootName("Strings"); String json = writer.writeValueAsString(myclass);
输出将是
{ "Strings": { "name" : "a", "address" : "b" } }
注意:
ObjectMapper是一个线程安全的,doc说它应该尽可能重用。
@Configuration公共类JacksonConfiguration {
@Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true); //mapper.setSerializationInclusion(Include.NON_DEFAULT); return mapper; }
}
结束了尝试编写自定义序列化器/解串器,它完全符合我的要求,只需要更多的努力:)