2016-05-24 2 views
0

НапримерКак использовать экземпляр Gson в классе Serializer/Deserializer?

public class HistoryRecordDeserializer implements JsonDeserializer<HistoryRecord> { 

    private LocalDateTimeConverter dateTimeConverter = new LocalDateTimeConverter(); 

    @Override 
    public HistoryRecord deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     User user = new User(); 
     user.setId(UUUID.fromString(json.get("user").get("id").getAsString())); 
     OtherData data = new OtherData(); 
     data.setData(json.get("otherData").getAsLong()); 
     return UserAndData(user, otherData); 
    } 

Как вы можете видеть, я экземпляр User и OtherData вручную, но я думаю, что есть лучшее решение. Каков наилучший способ десериализации пользователя с помощью fromJson(...)? Должен ли я передать экземпляр Gson на HistoryRecordDeserializer? Должен ли я создать новый?

+0

Это зависит от того, что ваш POJO и Json выглядеть. Вы могли бы создать новый Gson или использовать метод 'JsonDeserializationContext context'' deserialize' для объектов десериализатора – varren

+0

@varren, когда я в последний раз пытался использовать 'context.deserialize (json.get (« id »), UUID.class, context)' it просто верните «null». Почему это так? – Alexandr

+1

действительно не знают, но контекст в значительной степени похож на десанциализатор gson сверху. Если вы gson можете десериализовать это, тогда контекст также сможет это сделать. Но это нормально делать, как вы делали в вас пост выше – varren

ответ

0

Моя проблема решена с помощью JsonDeserializationContext.

@Override 
public HistoryRecord deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
    JsonObject object = json.getAsJsonObject(); 
    JsonObject extras = object.get("extraData").getAsJsonObject(); 

    HistoryRecord hr = object.context.deserialize(object.get("data"), HistoryRecord.class); 
    hr.appendExtraData(extras, HistoryRecordExtraData.class); 
    ... 
    } 

Как @varren печально:

Если вы Gson может десериализации это, то контекст будет также в состоянии сделать это.

Таким образом, вы можете даже применить другой пользовательский тип адаптера (LocalDateTimeConverter):

gson = new GsonBuilder() 
      .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeConverter()) 
      .registerTypeHierarchyAdapter(HistoryRecord.class, new HistoryRecordDeserializer()) 
      .create(); 

и использовать его внутри HistoryRecordDeserializer:

LocalDateTime localDateTime = context.deserialize(object.get("dateTime"), LocalDateTime.class); 
Смежные вопросы