2015-11-17 4 views
2

У меня есть 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(); 

Кто-нибудь знает другой способ достичь этого?

+0

Если ваш фактический прецедент настолько прост. Я бы просто воссоздал свойства. Если вам не нравится материал «MedID» и предпочитают «id». Вы можете использовать аннотацию '@SerializedName (« MedID ») для свойств. https://google.github.io/gson/apidocs/com/google/gson/annotations/SerializedName.html – AmazingDreams

+0

Я знаю это. Но этот способ необходим для создания каждого идентификатора для каждого объекта. Все мои сущности должны простираться от BaseData, у которого есть свойство id. И я не хочу разрушать всю структуру моих сущностей (просто сообщите, у меня есть 45 классов сущностей, как указано выше). – R4j

+0

Напишите собственный десериализатор. Выберете имя ключа в парах ключ-значение 'MedsID: 8063', например, и решите, какой экземпляр будет возвращен. Он будет вести себя как заводская модель. –

ответ

1

Единственный способ добиться этого - написать пользовательский де-сериализатор. См. Ниже пример:

public class CustomDeserializer implements JsonDeserializer<Dias>{ 

    public Dias deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException{ 
     JsonObject ja = json.getAsJsonObject(); 

     Dias dias = new Gson().fromJson(ja, Dias.class); 
     dias.id = ja.get("DiasID").getAsLong(); 

     return dias; 
    } 

} 

Реестр;

String dias = "{'DiasID':75820,'updated_at':'2015-11-04T06:59:55','name':'K'}"; 
Gson gson = new GsonBuilder().registerTypeAdapter(Dias.class, new CustomDeserializer()).create(); 
Dias dias2 = gson.fromJson(dias, Dias.class); 

System.out.println(dias2.id); 

Выход:

75820 

Это просто пример, вы можете продлить его, написав десериализатор для собственного базового класса.

+0

Ваш код может работать. Но когда я использую собственный десериализатор и регистрируюсь для 'BaseData', метод' deserialize' не вызывается. Похоже, что требуется зарегистрировать все подклассы. – R4j

+0

К сожалению, другого выхода нет. –

+0

хорошо, я обновил свой вопрос. 'registerTypeHierarchyAdapter' может помочь. Но это очень медленно – R4j

Смежные вопросы