Genson 1.4 (JSON) не обрабатывает унаследованные Pojo

Я использую genson 1.4 для обработки JSON в моей реализации REST, JSON Inheritance не работает при использовании genson . Пожалуйста, найдите пример структуры кода ниже.

Это мой 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": нулевой, "PrimaryKey": нулевая}

CountryCode,areaCode а также localNumber отсутствует в JSON, только базовый класс обрабатывается. Попробовал то же самое из кода, подобного этому

    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 ответ

Решение

По умолчанию Genson использует статический тип во время ser/de. То есть здесь он будет видеть объект как экземпляр SynBaseObject, а не конкретный тип PhoneNumber.

Вы можете указать Genson использовать тип среды выполнения через конфигурацию:

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

Здесь вы можете найти несколько примеров того, как настроить Genson с помощью Jaxrs.

Обратите внимание, что если вы когда-нибудь захотите десериализовать объект ResponseObject, у вас, вероятно, возникнут проблемы, так как в json нет информации о том, что является конкретным типом базового объекта. Однако, если использованный json также создан Genson, вы можете легко решить эту проблему, включив сериализацию метаданных класса. builder.useClassMetadata(true),

Еще немного документации об обработке полиморфных типов в Genson.

Другие вопросы по тегам