2017-12-18 25 views
1

このようなJSONレスポンスを解析しようとしています。Retrofit 2(+入れ子オブジェクト)で動的JSONを解析する方法

{ 
    "Cryptsy": { 
     "AMC": [ 
      "BTC" 
     ], 
     "CIRC": [ 
      "BTC" 
     ], 
     "SYNC": [ 
      "BTC" 
     ] 
    }, 
    "Bitstamp": { 
     "EUR": [ 
      "USD" 
     ], 
     "ETH": [ 
      "USD", 
      "EUR" 
     ], 
     "XRP": [ 
      "USD", 
      "EUR", 
      "BTC" 
     ] 
    }, 
    // ... 
    // More objects... 
    // ... 
} 

あなたが見ることができるように、この1は、動的なキーがあり、それぞれの値は、動的なキーでオブジェクトです。私は、この使用してretrofit2とGsonConverterを解析しようとしたが、それは例外

W/System.err: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $ 

私はJSONが入れ子になっていると、すべてのオブジェクトは、任意の固定キーを持っていないので、それはだと思うの原因となります。

ここに私のコードです。事前に

PairListResponse.java

// This is the GSON model class 

class PairListResponse { 

    private Map<String, Map<String, String[]>> exchangePairs; 

    PairListResponse() { 
    } 

    Map<String, Map<String, String[]>> getExchangePairs() { 
     return exchangePairs; 
    } 

    void setExchangePairs(Map<String, Map<String, String[]>> exchangePairs) { 
     this.exchangePairs = exchangePairs; 
    } 

    Map<String, String[]> getTradingPairs(String fromSymbol) { 
     return exchangePairs.get(fromSymbol); 
    } 
} 

PairListDeserializer.java

public class PairListDeserializer implements JsonDeserializer<PairListResponse> { 

    private static final String TAG = PairListDeserializer.class.getSimpleName(); 

    @Override 
    public PairListResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     final JsonObject jsonObject = json.getAsJsonObject(); 
     final Map<String, Map<String, String[]>> exchangePairs = readPairMap(jsonObject); 
     PairListResponse result = new PairListResponse(); 
     result.setExchangePairs(exchangePairs); 
     return result; 
    } 

    @Nullable 
    private Map<String, Map<String, String[]>> readPairMap(@NonNull final JsonObject jsonObject) { 
     // Initializing Hashmap for the outer object 
     final Map<String, Map<String, String[]>> result = new HashMap<>(); 

     for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) { 
      String exchange = entry.getKey(); 
      String fromSymbol; 
      String[] toSymbols; 
      JsonObject fsymbolObj = entry.getValue().getAsJsonObject(); 

     // Initializing Hashmap for inner objects 
      final Map<String, String[]> pairsPerCoin = new HashMap<>(); 

      for (Map.Entry<String, JsonElement> inner_entry : fsymbolObj.entrySet()) { 
       fromSymbol = inner_entry.getKey(); 
       toSymbols = toStringArray(inner_entry.getValue().getAsJsonArray()); 
       pairsPerCoin.put(fromSymbol, toSymbols); 
      } 
      result.put(exchange, pairsPerCoin); 
     } 
     return result; 
    } 

    private static String[] toStringArray(JsonArray array) { 
     if (array == null) return null; 
     String[] arr = new String[array.size()]; 
     for (int i = 0; i < arr.length; i++) { 
      arr[i] = array.get(i).toString(); 
     } 
     return arr; 
    } 
} 

ありがとう!

答えて

0

申し訳ありませんが、私は間違ったミスを犯しました! 私の改造API呼び出しで、正しいモデルクラス名を設定するのを忘れました。

public interface TradingPairAPICall { 
    @GET("exchanges") 
    Call<String> getAllPairList(); 
} 

は実際には、それは私がそれを変更し、それが正常に働いていた

Call<PairListResponse> getAllPairList(); 

する必要があります。

関連する問題