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

Genson 1.4 (JSON) not processing inherited Pojo's

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

这是我的基地Object

This is my BaseObject

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

这是我的ChildClass

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

这是我的回复Object

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":{"status":null},"errorCode":null,"errorMessage":null,"primaryKey":null}

CountryCodeareaCodelocalNumber 在 JSON 中丢失,只处理基数 class。尝试从这样的代码中进行同样的操作

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

输出与其余服务相同。

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

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

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

在这里您可以找到一些关于如何 customize Genson with Jaxrs.

的示例

请注意,如果您想反序列化为 ResponseObject,那么您可能会遇到麻烦,因为在 json 中没有关于基础对象的具体类型的信息。但是,如果使用的 json 也是由 Genson 生成的,您可以通过启用 class 元数据序列化 builder.useClassMetadata(true).

轻松解决此问题

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