2015-11-17 12 views
13

次の動的キーJson Stringを解析しようとしています。改造を使用して動的キーJson Stringを解析する

"report":{ 
    "data":{ 
     "results":{ 
      "558952cca6d73d7d81c2eb9d":{ 
       "Max":-1, 
       "Min":-1, 
       "Slope":-1, 
      }, 

      "558ce148a6d73d7d81c2fa8a":{ 
       "Max":-2, 
       "Min":-1, 
       "Slope":-2, 
      } 
     } 
    } 
} 

私はデータを取得しようとしていますが、最後の動的json Stringの解析中にエラーが発生しています。

public class Report { 
     @SerializedName("data") 
     @Expose 
     private Data data; 

     public Data getData() { 
      return data; 
     } 

     public void setData(Data data) { 
      this.data = data; 
     } 

     @Override 
     public String toString() { 
      return "Report{" + 
        "data=" + data + 
        '}'; 
     } 
    } 

    public class Data { 
     @SerializedName("results") 
     @Expose 
     private ResultInside result; 

     public ResultInside getResult() { 
      return result; 
     } 

     public void setResult(ResultInside result) { 
      this.result = result; 
     } 
    } 

    public class ResultInside { 
     /*@SerializedName("results") 
     @Expose*/ 
     private Map<String, Vitals> elemDetails = new HashMap<>(); 

     public Map<String, Vitals> getElemDetails() { 
      return elemDetails; 
     } 

     public void setElemDetails(Map<String, Vitals> elemDetails) { 
      this.elemDetails = elemDetails; 
     } 
    } 

この場合、どのように解析するかを教えてください。

+0

こんにちは!あなたは解決策を見つけましたか?私も同じ問題がありました。 – GensaGames

+0

@GenkaKasyan以下の回答を確認してください。 – CoDe

+0

@ Shubh Hai、私は同じ問題を抱えています.Pojoクラスを動的キーに追加する方法がわかりません.Vitalsクラスで使用したことを教えてください。 – MathaN

答えて

29

resultInsideクラスはJSONに存在しない余分なオブジェクトレイヤーを追加しています。 Dataクラスresultsフィールドに地図を移動してみてください。

public class Data { 
    @SerializedName("results") 
    @Expose 
    private Map<String, Vitals> result; 

    //.... 
} 
+1

あなた天才:)おかげで。 – CoDe

+0

JSONを動的な名前(動的な名前)で解析したい場合は、HashMapを使う必要があります。だから、この答えは私から正しい+1です。静的な名前(動的名ではありません)を持つオブジェクトレベルにHashMapを配置していることを確認してください。 – Sniper

+0

ありがとうございました。あなたが私の時間を保存しました:) –

1

これを行うには良い方法、次のようになります、その後

public class DataParser implements JsonDeserializer<Data> { 


    @Override 
    public Data deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 

     Data result = new Data(); 


     try { 
      final HashMap<String, DataValues> map = readServiceUrlMap(json.getAsJsonObject()); 

      if(map != null) { 
       result.dataValues = map; 
      } 

     }catch (JsonSyntaxException ex){ 
      return null; 
     } 

     return result; 
    } 


    private HashMap<String, DataValues> readServiceUrlMap(final JsonObject jsonObject) throws JsonSyntaxException { 

     if(jsonObject == null) { 
      return null; 
     } 
     Gson gson = new Gson(); 

     HashMap<String, DataValues> products = new HashMap<>(); 

     for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) { 

      String key = entry.getKey(); 
      DataValues value = gson.fromJson(entry.getValue(), DataValues.class); 
      products.put(key, value); 
     } 
     return products; 
    } 


---------------------------------------------- 

あなたApiClientクラス

でこれを入力します。

その後、
---------------------- 

public class Report { 
     @SerializedName("data") 
     @Expose 
     private Data data; 

---------------------- 

public class Data { 


    public HashMap<String, DataValues> dataValues; 


    public Data() { 
     this.dataVaues = new HashMap<>(); 
    } 
} 

----------------------------- 

、このようなParserクラスを作成します

public class ApiClient { 


    private static Retrofit retrofit = null; 

    public static Retrofit getClient(String baseUrl) { 

     if(retrofit == null) { 

      GsonBuilder gsonBuilder = new GsonBuilder(); 
      gsonBuilder.registerTypeAdapter(Data.class, new DataParser()); 

      retrofit = new Retrofit.Builder() 
        .baseUrl(baseUrl) 
        .addConverterFactory(GsonConverterFactory.create(gsonBuilder.create())) 
        .build(); 

one

関連する問題