Genson 1.4(JSON)不处理继承的Pojo

时间:2016-07-29 10:04:17

标签: java json rest inheritance genson

我在我的REST实现中使用genson 1.4进行JSON处理,使用genson时,JSON继承不起作用。请在下面找到示例代码结构。

这是我的BaseObject

This is my BaseObject

public class SynBaseObject implements Serializable
{
 private Long status;
//GettersAndSetters
}

这是我的儿童班

public class PhoneNumber extends SynBaseObject
{
private  String      countryCode;
private  String      areaCode;
private  String      localNumber;
//GettersAndSetters
}

这是我的响应对象

public class ResponseObject  implements Serializable
{ 
private Integer errorCode;
private String errorMessage;
private Long    primaryKey;

private SynBaseObject baseClass;

public ResponseObject()
{

}

public SynBaseObject getBaseObject()
{
return baseClass;
}

public void setBaseObject(SynBaseObject baseClass)
{
this.baseClass = baseClass;
}

public Integer getErrorCode()
{
return errorCode;
}

public void setErrorCode(Integer errorCode)
{
this.errorCode = errorCode;
}

}

这是GENSON JSON输出:

  

{" baseObject" {"状态":空}"的errorCode":空,"的errorMessage":空,&# 34;的PrimaryKey":空}

JSON中缺少

CountryCodeareaCodelocalNumber,只处理了基类。从这样的代码中取样相同

    Genson genson = new Genson();
    PhoneNumber number = new PhoneNumber();
    number.setCountryCode("2");
    number.setAreaCode("3");
    number.setLocalNumber("9645");
    ResponseObject responseObject = new ResponseObject();
    responseObject.setBaseObject(number);
    String serialize = genson.serialize(responseObject);
    System.out.println(serialize);

输出与其他服务相同。

1 个答案:

答案 0 :(得分:0)

默认情况下,Genson在ser / de期间使用静态类型。这里的意思是它将对象视为SynBaseObject的一个实例而不是具体类型的PhoneNumber。

您可以告诉Genson通过配置使用运行时类型:

Genson genson = new GensonBuilder().useRuntimeType(true).create();

您可以在此处找到有关如何customize Genson with Jaxrs的一些示例。

请注意,如果您希望反序列化为ResponseObject,那么您可能会遇到麻烦,因为在json中没有关于什么是基础对象的具体类型的信息。但是,如果消耗的json也是由Genson生成的,则可以通过启用类元数据序列化builder.useClassMetadata(true)轻松解决此问题。

有关Genson中handling of polymorphic类型的更多文档。