Самые дорогие стокповерты,
Мне было интересно, знает ли кто, как решить это наилучшим образом; Я говорю с api, который возвращает объект json следующим образом:
{
"field1": "value1",
"field2": "value2",
"details": {
"nested1": 1,
"nested2": 1
}
В java у меня есть объект (сущность), который, например, имел бы все эти поля, но с деталями как свободные поля, поэтому: field1, field2, nested1, nested2.
Это потому, что это проект андроида, и я не могу просто сохранить класс с информацией в мою сущность, так как я обязан или просто объединить.
Есть ли способ преобразовать поля в мой объект с помощью GSON? обратите внимание, что я использую общий класс для преобразования данных прямо сейчас из API. И я хочу сохранить эти поля (которые содержат информацию как int). В том же объекте.
Вы можете написать адаптер настраиваемого типа, чтобы сопоставить значение 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);
Выход:
О TypeAdapter:
https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/TypeAdapter.html