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.