JSON在序列化程序中使用子对象

时间:2013-06-27 12:55:22

标签: java json

沃尔克斯! 我有JSON序列化的问题 例如,我有两个类

public class Site {
private String eID;
private Integer sID;

public Site(String eID, Integer sID){
    this.sID = sID;
    this.eID = eID;
}

public String getEID(){
    return eID;
}

public Integer getSID(){
    return sID;
} }

和包含先前类型的对象的类。例如,像

public class Address{
private BigInteger addrID;
private ICOMSSitePOJO site;

public AddressUnitPOJO(BigInteger addrID, Site site){
    this.addrID = addrID;
    this.site = new Site(site.getEID(), site.getSID());
}

和吸气者和制定者也

因此对于Site类我使用follow serialize class

public class SiteSerializer extends JsonSerializer<Site>  {
@Override
public void serialize(Site obj, JsonGenerator jsonGenerator,
                      SerializerProvider serializerProvider) throws IOException, JsonProcessingException
{
    jsonGenerator.writeStartObject();
    jsonGenerator.writeFieldName("sID");
    jsonGenerator.writeNumber(obj.getSID());
    jsonGenerator.writeFieldName("eID");
    jsonGenerator.writeString(obj.getEID());
    jsonGenerator.writeEndObject();
}

然后我想序列化我的Address类。为此,我可以做到以下几点:

   public class AddressUnitSerializer extends JsonSerializer<AddressUnitPOJO> {

    @Override
    public void serialize(AddressUnitPOJO obj, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider)
                                        throws IOException, JsonProcessingException {
        jsonGenerator.writeStartObject();

        jsonGenerator.writeFieldName("addressID");
        jsonGenerator.writeNumber(obj.getAddressID());

//I don't want to do this rutine every time!!!
/*      jsonGenerator.writeFieldName("Site");

        jsonGenerator.writeStartObject();
        jsonGenerator.writeFieldName("sID");
        jsonGenerator.writeNumber(obj.getSite().getSID());
        jsonGenerator.writeFieldName("eID");
        jsonGenerator.writeNumber(obj.getSite().getEID());
        jsonGenerator.writeEndObject();*/
//!!!

        jsonGenerator.writeEndObject();

    }
}

如何重用我的子对象的previos序列化?我搜索了答案,但没有找到解决方案。 谢谢你的建议!

修改1

所以我现在所做的是

  public class AddressUnitSerializer extends JsonSerializer<AddressUnitPOJO> {

@Override
public void serialize(AddressUnitPOJO obj, JsonGenerator jsonGenerator,
                      SerializerProvider serializerProvider)
                                    throws IOException, JsonProcessingException {
    jsonGenerator.writeStartObject();

    jsonGenerator.writeFieldName("addressID");
    jsonGenerator.writeNumber(obj.getAddressID());

ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.ALL, JsonAutoDetect.Visibility.ANY);
mapper.configure(SerializationConfig.Feature.WRITE_NULL_PROPERTIES, false);
Site site = obj.getAddressUnit().getSite();

jsonGenerator.writeFieldName("Site");
jsonGenerator.writeString(mapper.writeValueAsString(site).
                            substring(0,mapper.writeValueAsString(site).length()-1));


    jsonGenerator.writeEndObject();

}
 }

但也许有更好的方法可以用注释转换它吗?

1 个答案:

答案 0 :(得分:0)

生成JSON String的最简单方法是使用 方法.writeObject(objName),它自动生成字段及其值。 如果您需要其他值的名称或从生成或格式字符串中排除值,则可以使用标准声明。