只是想知道是否有办法做到这一点 - 我有一个类,比如
class MyClass {
private String name;
private String address;
private String number;
}
当我使用Jackson将它序列化为Json时,我想将String变量包装在一起,所以它看起来像
{
"Strings": {
"name" : "value",
"address" : "value"
}
}
不将这些变量包装在MyClass中的List或Map类中......这可能吗?
答案 0 :(得分:2)
您还可以在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<String, String> getStrings() {
Map<String, String> map = new LinkedHashMap<String, String>();
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"
}
}
这可能是您可以使用的最优雅的解决方案,但它很简单。
答案 1 :(得分:1)
杰克逊利用你的类结构来决定json结构。如果需要将类属性包装在另一个属性中,则需要考虑包装。如果您不需要,则无需创建集合。只需将名称和地址放在不同的类中,并将该类命名为您希望其包装器的名称。然后在MyClass中添加包装类的实例。
答案 2 :(得分:0)
我使用JsonSerializer
为我做这个,这很简单。
您创建了一个扩展JsonSerializer
public class ServerResposeSerializer extends JsonSerializer<ServerResponse> { @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字符串
答案 3 :(得分:0)
@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;
}
}
答案 4 :(得分:-1)
完成了编写自定义序列化器/解串器的尝试,它完全符合我的要求,只需付出更多的努力:)