У меня есть JSON данные, как это:Gson разобрать на Pojo с пользовательским ключом
meds:
[
{
MedsID: 8063,
updated_at: "2015-11-04T06:59:55",
treatment_date: "2015-11-04T00:00:00",
name: "name"
}
],
scores:
[
{
ScoreID: 75820,
updated_at: "2015-11-04T06:59:55"
dialysis_flow: 233,
}
],
dias:
[
{
DiasID: 75820,
updated_at: "2015-11-04T06:59:55"
name: "K",
}
]
А вот мои Сущности:
public class BaseData{
public long id;
}
public class Med extends BaseData{
public String name;
public String updated_at;
public String treatment_date;
}
public class Score extends BaseData{
public String updated_at;
public int dialysis_flow;
}
public class Dias extends BaseData{
public String name;
public String updated_at;
public String treatment_date;
}
Поскольку все объекты отображаются из базы данных с ключом id
(как Я использую orm db, он загружается именем свойства). Поэтому мне нужно разобрать все остальные ключи MedsID
, DiasID
, ScoreID
в id
при сопоставлении gson.
Есть ли способ достичь этого?
Update:
Я использую registerTypeHierarchyAdapter
вместо registerTypeAdapter
и он может работать. Но этот способ чрезвычайно медленный, так как мои данные json очень большие.
public class DataDeserializer implements JsonDeserializer<BaseData> {
@Override
public BaseData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject ja = json.getAsJsonObject();
Gson gson = new Gson();
final String[] mapIds = {"ScoreID", "MedsID", "DiasID"};
BaseData data = gson.fromJson(ja, typeOfT);
for (String idKey:mapIds){
if(ja.has(idKey)){
data.id = ja.get(idKey).getAsLong();
break;
}
}
return data;
}
}
Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(BaseData.class, new DataDeserializer()).create();
Кто-нибудь знает другой способ достичь этого?
Если ваш фактический прецедент настолько прост. Я бы просто воссоздал свойства. Если вам не нравится материал «MedID» и предпочитают «id». Вы можете использовать аннотацию '@SerializedName (« MedID ») для свойств. https://google.github.io/gson/apidocs/com/google/gson/annotations/SerializedName.html – AmazingDreams
Я знаю это. Но этот способ необходим для создания каждого идентификатора для каждого объекта. Все мои сущности должны простираться от BaseData, у которого есть свойство id. И я не хочу разрушать всю структуру моих сущностей (просто сообщите, у меня есть 45 классов сущностей, как указано выше). – R4j
Напишите собственный десериализатор. Выберете имя ключа в парах ключ-значение 'MedsID: 8063', например, и решите, какой экземпляр будет возвращен. Он будет вести себя как заводская модель. –