Поместить вложенный объект в целевой объект с помощью GSON

1

Самые дорогие стокповерты,

Мне было интересно, знает ли кто, как решить это наилучшим образом; Я говорю с api, который возвращает объект json следующим образом:

{
   "field1": "value1",
   "field2": "value2",
   "details": {
      "nested1": 1,
      "nested2": 1

}

В java у меня есть объект (сущность), который, например, имел бы все эти поля, но с деталями как свободные поля, поэтому: field1, field2, nested1, nested2.

Это потому, что это проект андроида, и я не могу просто сохранить класс с информацией в мою сущность, так как я обязан или просто объединить.

Есть ли способ преобразовать поля в мой объект с помощью GSON? обратите внимание, что я использую общий класс для преобразования данных прямо сейчас из API. И я хочу сохранить эти поля (которые содержат информацию как int). В том же объекте.

  • 0
    Вы можете иметь field3, field4 .. fieldn и nested3, nested4 ... nestedn? или только field1, field2 и nested1, nested2?
  • 0
    Что-нибудь действительно, это не статично, так как в нем задействовано около 30 объектов.
Теги:
gson
ormlite

1 ответ

2

Вы можете написать адаптер настраиваемого типа, чтобы сопоставить значение json с вашим pojo.

Определить pojo:

public class DataHolder {
    public List<String> fieldList;
    public List<Integer> detailList;
}

Напишите пользовательский тип адаптера:

public class CustomTypeAdapter extends TypeAdapter<DataHolder> {
    public DataHolder read(JsonReader in) throws IOException {
        final DataHolder dataHolder = new DataHolder();

        in.beginObject();

        while (in.hasNext()) {
            String name = in.nextName();

            if (name.startsWith("field")) {
                if (dataHolder.fieldList == null) {
                    dataHolder.fieldList = new ArrayList<String>();
                }
                dataHolder.fieldList.add(in.nextString());
            } else if (name.equals("details")) {
                in.beginObject();
                dataHolder.detailList = new ArrayList<Integer>();
            } else if (name.startsWith("nested")) {
                dataHolder.detailList.add(in.nextInt());
            }
        }

        if(dataHolder.detailList != null) {
            in.endObject();
        }
        in.endObject();

        return dataHolder;
    }

    public void write(JsonWriter writer, DataHolder value) throws IOException {
        throw new RuntimeException("CustomTypeAdapter write method not implemented!");
    }
}

Контрольная работа:

    String json = "{\"field1\":\"value1\",\"field2\":\"value2\",\"details\":{\"nested1\":1,\"nested2\":1}}";

    GsonBuilder builder = new GsonBuilder();
    builder.registerTypeAdapter(DataHolder.class, new CustomTypeAdapter());

    Gson gson = builder.create();

    DataHolder dataHolder = gson.fromJson(json, DataHolder.class);

Выход: Изображение 174551

О TypeAdapter:

https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/TypeAdapter.html

http://www.javacreed.com/gson-typeadapter-example/

  • 0
    Спасибо за ваше объяснение, вопрос, как я могу автоматически устанавливать поля DataHolder и управлять только определенными пользовательскими полями?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню