簡體   English   中英

Gson 使用自定義鍵解析為 POJO

[英]Gson parse to POJO with custom key

我有這樣的json數據:

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 時,它是由屬性 name 加載的)。 所以我需要在通過 gson 映射時將所有其他鍵MedsIDDiasIDScoreIDid
有什么方法可以實現嗎?

更新
我使用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();

有誰知道其他方法來實現這一目標?

實現這一點的唯一方法是編寫自定義反序列化器。 請看下面的例子:

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

這只是一個示例,您可以通過為自己的基類編寫反序列化器來擴展它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM