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; } 

}

结束了尝试编写自定义序列化器/解串器,它完全符合我的要求,只需要更多的努力:)