我试图将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;
}
答案 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很糟糕:(