2016-09-19 18 views
1

私はworldbank.comからjsonを非公開にしようとしています。 jsonは次のようになります: [{"" page:1、 "pages":7、 "per_page": "50"、 "total":304}、[{"id": "ABW"、 "iso2Code" AW " "名前": "アルバ"、 "領域":{ "ID": "LCN"、 "値":" ラテンアメリカ&カリブ海「}、gsonでjsonを逆シリアル化する

を介して見つけることができる:http://api.worldbank.org/countries/?format=json

とイム私に言ってgsonの問題に実行している: WorldBankDemo:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:期待BEGIN_OBJECTしかしBEGIN_ARRAYは行1列52パス$で[1]

た任意の手がかりとしてどのように私はこれを解決することができますか?好ましくはそれは私が(改造)を使用していネットワーキングのlibによって使用されるlibですので、gsonから

WorldBankDataService service = ServiceFactory.createRetrofitService(WorldBankDataService.class, WorldBankDataService.SERVICE_ENDPOINT); 
     service.getCountries() 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<WorldBank[]>() { 
        @Override 
        public final void onCompleted() { 
         // do nothing 
        } 

        @Override 
        public final void onError(Throwable e) { 
         Log.e("WorldBankDemo", e.getMessage()); 
        } 

        @Override 
        public final void onNext(WorldBank[] response) { 
         Log.d("TAG", "resp: "+response); 
         //mCardAdapter.addData(response); 
        } 
       }); 


public class ServiceFactory { 
/** 
* Creates a retrofit service from an arbitrary class (clazz) 
* @param clazz Java interface of the retrofit service 
* @param endPoint REST endpoint url 
* @return retrofit service with defined endpoint 
*/ 
public static <T> T createRetrofitService(final Class<T> clazz, final 
String endPoint) { 
     final RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(endPoint) 
       .setLogLevel(RestAdapter.LogLevel.FULL) 
       .build(); 
     T service = restAdapter.create(clazz); 

     return service; 
    } 
} 

public class WorldBank { 
    int page; 
    int pages; 
    String per_page; 
    int total; 
    //Country[] countrys; 
} 
+1

はここ –

+1

ショーをあなたのコードを入れて吸いますあなたのコード.... – ElefantPhace

+0

ここにWorldBankDemo **クラスコードを入れますか? –

答えて

1

JSONはオブジェクトや配列を含むことができますが、同じレベルではありません。上記のJSON構造では、最初の要素がオブジェクトであり、select要素がこのような種類のJSON構造は自動解析にはお勧めできません。同じJSON応答を続けたい場合は、手動で解析したり応答構造を変更することができます。私たちは国のリストを取得する必要があります.IFあなたは例えば、残りのクライアント

を起動している間、この依存関係

compile 'org.immutables:gson:2.3.1' 

しかし、わずかに異なる方法を使用してカスタマイズするgsonを使用することができます

0

を変更せずに、それは実際にJSON配列です。クラスを使用することはできません。これを試してください:魅力

+0

ここではページとページのキーについては言及していません。 idとiso2codeのjson配列だけです。 – drulabs

+0

改造でそれを行う方法は? ( – erbsman

+0

あなたの編集した質問をコードで見ただけです。必要に応じて生の文字列を取得して自分自身を解析します。これがRetrofitで可能かどうかはわかりません。 JSONレスポンスにマッチして、あなたにそのクラスのオブジェクトを与えるためにretrofitを教えてください。このクラスはWorldBankをプライベート変数として持ち、そのidとiso2code pojoクラスの配列を持ちます。 – drulabs

0

よう

YourPojo[] objects = gson.fromJson(jsonString, YourPojo[].class) 

作品は

Gson gson = new Gson(); 
String jsonOutput = "Your JSON String"; 
Type listType = new TypeToken<List<ApiResponse>>(){}.getType(); 
List<ApiResponse> posts = (List<ApiResponse>) gson.fromJson(jsonOutput, listType); 

ApiResponse

public class ApiResponse{ 
WorldBank object1; 
ArrayList<Country> objects2; 
} 

のように私は私の最後でこれをしようとしていないでこの方法を試してみてくださいしかし、それはそれに似ています。

0

は、インターフェースを宣言し

public interface GetAllAPI { 
@GET("/all") 
    List<Country> getCountries(); 
} 

今、残りのクライアントになります

public List<Country> GetAllCountries() { 

    Gson gson = new GsonBuilder().create(); 

    RestAdapter restAdapter = new RestAdapter.Builder() 
    .setEndpoint(service_url) 
    .setConverter(new GsonConverter(gson)) 
    .build(); 

    GetAllAPI service = restAdapter.create(GetAllAPI.class); 

    List<Country> countrylist = service.getCountries(); 

    return countrylist; 
} 

APIから結果を取得するあなたが特定の要件のために、この実装をカスタマイズする必要が

List<Country> countrylist = service.getCountries(); 

になります。これは、より明確にするためにthisを通じてGsonゴー

Retrofitとを実装する方法

0

はあきらめて別のAPIを使用することを決めた考えである、世界の銀行のAPIだけ:(

関連する問題