【问题标题】:Reading inner json object with retrofit and rxjava使用改造和 rxjava 读取内部 json 对象
【发布时间】: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


【解决方案1】:

您需要输入String的数字类型:

public class Row {
    private String coord_shirota; // <- String not float
    private String coord_dolgota; // <- String not float
    private String www;
    private String description;
    private String address_manual;
    private String name;
    //...getters
}

或让响应以数字形式返回它们:

"row": {
            "coord_shirota": 59.932723,  <- NOT "59.932723"

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 2017-08-26
    • 2017-10-11
    • 2021-12-19
    • 2019-07-05
    • 2014-10-16
    • 2015-08-23
    • 2018-10-05
    相关资源
    最近更新 更多