Java& Json:序列化时包装元素

时间:2013-07-10 09:44:03

标签: java json jackson

只是想知道是否有办法做到这一点 - 我有一个类,比如

class MyClass {
    private String name;
    private String address;
    private String number;
}

当我使用Jackson将它序列化为Json时,我想将String变量包装在一起,所以它看起来像

{
    "Strings": {
         "name" : "value",
         "address" : "value"
    }
 }

不将这些变量包装在MyClass中的List或Map类中......这可能吗?

5 个答案:

答案 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)

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