用gson

时间:2016-09-19 12:48:35

标签: android json gson retrofit

我试图将json从worldbank.com反序列化为pojo而没有任何成功。 json看起来像: [{"页面":1,"页面":7," per_page":" 50""总" :304},[{" ID":" ABW"" iso2Code":" AW""名称" :"阿鲁巴""区域" {" ID":" LCN""值":&#34 ;拉丁美洲&加勒比海"},

可以通过:http://api.worldbank.org/countries/?format=json

找到

我和gson一起遇到问题告诉我: WorldBankDemo:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期BEGIN_OBJECT但在第1行第52行路径为$ [1]

的BEGIN_ARRAY

关于我如何解决这个问题的任何线索?最好不要改变gson,因为这是网络库使用的lib我使用(改造)

 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;
}

5 个答案:

答案 0 :(得分:2)

JSON构造不好(特别是对于自动解析),Array可以包含对象或数组但不能同时包含两个对象,在上面的JSON结构中,它以Array开头,第一个元素是对象,第二个元素是数组,所以不建议将这种JSON结构用于自动解析,如果你想继续使用相同的JSON响应,你可以去手动解析或更改响应结构。

答案 1 :(得分:0)

它实际上是一个JSON数组。所以你不能使用课程。试试这个:

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

就像一个魅力

答案 2 :(得分:0)

试试这种方式

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

ApiResponse 就像

{{1}}

我没有尝试过这个,但它会像那样。

答案 3 :(得分:0)

您可以使用gson使用此依赖项进行自定义

compile 'org.immutables:gson:2.3.1'

但是在调用其余客户端时的方式略有不同

例如。如果我们必须获得一个国家列表声明一个接口

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();

您必须针对特定要求自定义此实施。这是一个如何使用Gson

实施Retrofit的想法

浏览this以获得更多说明

答案 4 :(得分:0)

决定放弃并使用另一个api,世界银行api很糟糕:(