【发布时间】:2018-04-05 18:18:06
【问题描述】:
我想从服务器读取响应,但内部 Json 有问题
Json 对象给我带来了这么多问题::(
[
{
"num_id": 1,
"row": {
"coord_shirota": "59.932723",
"www": "www.anichkov.ru",
"metro": "Гостиный Двор",
"description": "Старейшее здание на Невском проспекте, императорская резиденция",
"address_manual": "Санкт-Петербург, Невский просп., 39 лит. А",
"obj_history": "",
"oid": "3285",
"work_time": "пн-сб 10:00-18:00",
"ogrn": "2147483647123",
"metro_distance": "584.0",
"phone": "8(812)310-93-80, 8(812)310-43-95.",
"inn": "7840325991",
"street": "Невский проспект",
"metro_dolgota": "30.333745",
"home": "39",
"name_en": "Anichkov Palace",
"metro_line": "Невско-Василеостровская линия",
"name": "Аничков Дворец",
"town": "Санкт-Петербург",
"for_disabled": "0",
"addressline": "Санкт-Петербург, Невский проспект, 39",
"district": "Центральный район",
"country": "Россия",
"obj_history_en": "",
"subdistrict": "муниципальный округ № 78",
"coord_dolgota": "30.341459",
"description_en": "The oldest building on Nevsky prospekt, imperial palace",
"metro_shirota": "59.933938",
"type": "Исторический",
"email": "anichkovmuz@mail.ru"
}
},
...
]
我的 Api 请求:
public interface SpbGovSiteApi {
@Headers({ "Authorization: Token 60a368fde851f786532fdb4b65c6fdb189122666" })
@GET("123/versions/latest/data?per_page=1000")
Call<List<SpbGovSiteResponse>> getInfo();
}
我的回复类:
public class Row {
private float coord_shirota;
private float coord_dolgota;
private String www;
private String description;
private String address_manual;
private String name;
//...getters
}
class SpbGovSiteResponse {
private Row row;
public Row getRow() {
return row;
}
}
我的改造功能:
public Observable<Map<String,String>> getInfo() {
return spbGovSiteResponse(retrofit.create(SpbGovSiteApi.class).getInfo());
}
private Observable<Map<String,String>> spbGovSiteResponse(Call<List<SpbGovSiteResponse>> call){
Log.e("gg",call.request().url().toString());
return Observable.create(e -> {
call.enqueue(new Callback<List<SpbGovSiteResponse>>() {
@Override
public void onResponse(Call<List<SpbGovSiteResponse>> call1, Response<List<SpbGovSiteResponse>> response) {
for(SpbGovSiteResponse item: response.body()) {
Map map=new HashMap<String,String>();
//map.put("name",item.getRow().getName());
//map.put("longtide",item.getRow().getCoord_dolgota());
//map.put("latitude",item.getRow().getCoord_shirota());
e.onNext(map);
}
e.onComplete();
}
@Override
public void onFailure(Call<List<SpbGovSiteResponse>> call1, Throwable t) {
e.onError(t);
}
});
});
}
最后是我的问题:
在观察者中,我使用接口方法onFailed的可抛出参数将其打印在日志中。
04-05 18:52:01.019 14703-14703/ru.scapegoats.museumspb W/System.err: java.lang.NumberFormatException: empty String
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1071)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at java.lang.Double.parseDouble(Double.java:547)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at com.google.gson.stream.JsonReader.nextDouble(JsonReader.java:909)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at com.google.gson.Gson$3.read(Gson.java:308)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at com.google.gson.Gson$3.read(Gson.java:302)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:119)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:218)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:112)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at okhttp3.RealCall$AsyncCall.execute(RealCall.java:141)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
04-05 18:52:01.020 14703-14703/ru.scapegoats.museumspb W/System.err: at java.lang.Thread.run(Thread.java:761)
如果我将 SpbGovSiteApi 类留空,我的程序工作得很好......所以我决定那里出现这个问题的原因 -_-
如果我评论它
class SpbGovSiteResponse {
private int num_id;
// private Row row;
// public Row getRow() {
// return row;
// }
}
我的程序运行没有问题
【问题讨论】:
-
打印出你的
response.body()并检查它是否不为空并且有你想要获取的数据。顺便说一句,我建议您使用 GSON 库将您的 JSON 响应反序列化为有效的类对象,这将使您的生活更轻松。 -
如果我的字段
private Row row将被取消注释,我无法进入方法 onSucces ->我无法打印正文.. -
您能提供您遇到的错误的日志吗?
-
04-05 17:57:55.130 11465-11465/ru.scapegoats.museumspb E/gg: error empty String这是我的实际错误,而不是我的文字 -
这只是一行,还不够。我们需要查看错误发生时在
logcat中打印的错误堆栈跟踪。
标签: java android retrofit2 rx-java2