Архив за месяц: Октябрь 2015

Gson, java. Forgot to register a type adapter?

Данная ошибка возникает когда библиотека gson не может конвертировать объект не простого типа в json. Например когда мы напрямую вызываем:

    GsonBuilder gsonBuilder = new GsonBuilder();
    Gson gson = gsonBuilder.create();
    return gson.toJson(myMegaObj);

В данном случае необходимо вручную указать каким образом будет сконвертирован объект myMegaObj путем создания класса сериалайзера. В данной заметке мы покажем как избавиться от ошибки в заголовке и создадим простой адаптер для преобразования объекта в json. Для этого зарегистрируем адаптер, до метода toJson

public static String getJsonString(MyMegaObj myMegaObj){
    GsonBuilder gsonBuilder = new GsonBuilder();
    //регистрация адаптеров
    gsonBuilder.registerTypeAdapter(MyMegaObj.class, new MyMegaObjSerializer());
    gsonBuilder.registerTypeAdapter(MyObj.class, new MyObjSerializer());

    Gson gson = gsonBuilder.create();
    return gson.toJson(myMegaObj);
}

А теперь реализуем адаптер.

public class MyMegaObjSerializer implements JsonSerializer {
    @Override
    public JsonObject serialize(MyMegaObj myMegaObj, Type type, JsonSerializationContext context) {
        JsonObject result = new JsonObject();
        JsonObject fields = new JsonObject();

        //fields
        result.add("fields", fields);
        for (Map.Entry fieldEntry : myMegaObj.getFields().entrySet()) {
            fields.add(fieldEntry.getKey(), context.serialize(fieldEntry.getValue()));
        }

        return result;
    }
}