改造Json数据被截断

问题描述 投票:0回答:2

我正在使用 Retrofit 和 RxAndroid 向基于 Django 的服务器发送 GET 请求,服务器响应 JSON 数据。 我发现有趣的事情是,使用 stetho,Json 的最后一个右大括号丢失了。所以我收到了这个错误消息:

W/System.err: java.io.EOFException: End of input at line 1 column 812 path $.user
W/System.err:     at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1393)
W/System.err:     at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:482)
W/System.err:     at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:414)
W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:214)
W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
W/System.err:     at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:117)
W/System.err:     at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211)
W/System.err:     at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
W/System.err:     at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:171)
W/System.err:     at rx.Subscriber.setProducer(Subscriber.java:211)
W/System.err:     at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102)
W/System.err:     at rx.Subscriber.setProducer(Subscriber.java:205)
W/System.err:     at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
W/System.err:     at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
W/System.err:     at rx.Observable.unsafeSubscribe(Observable.java:10142)
W/System.err:     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)
W/System.err:     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
W/System.err:     at rx.Observable.unsafeSubscribe(Observable.java:10142)
W/System.err:     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)
W/System.err:     at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
W/System.err:     at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
W/System.err:     at rx.Observable.unsafeSubscribe(Observable.java:10142)
W/System.err:     at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
W/System.err:     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
W/System.err:     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
W/System.err:     at java.lang.Thread.run(Thread.java:764)

这是来自 stetho 的 json 数据:

{"id":47,"credit_card":"","order_ordereditem_set":[{"id":36,"product_item":{"id":3,"category":{"id":1,"name":"Fruit"},"added_time":"2018-02-11 15:23:21","upc":"4321","desc":"Mandarin","price":150,"img_url":"http://15.32.134.74:8000/media/images/products/mandarin.jpg","not_sale":false,"is_hot":false,"is_recommended":false},"added_time":"2018-02-12 14:02:11","quantity":1,"order_id":47},{"id":37,"product_item":{"id":2,"category":{"id":1,"name":"Fruit"},"added_time":"2018-02-08 13:29:07","upc":"123456","desc":"Kiwi","price":500,"img_url":"http://15.32.134.74:8000/media/images/products/kiwi.jpg","not_sale":false,"is_hot":true,"is_recommended":false},"added_time":"2018-02-12 14:02:11","quantity":1,"order_id":47}],"added_time":"2018-02-12 14:02:11","payment":"0","total_quantity":2,"total_price":6.5,"user":1

但是我检查了wireshark,没有丢失右括号。 我也用过postman,但是没有问题

这个问题出现了30%。

以下是我的代码详细信息:

private HttpUtil() {
        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd HH:mm:ss")
                .create();

        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(getOkHttpClient())
                .baseUrl(SERVER_BASE_URL)
                .build();
        mService = retrofit.create(RestAPIService.class);
    }

    static public HttpUtil getHttpUtilInstance() {
        if (mHttpUtil == null) {
            synchronized (HttpUtil.class) {
                mHttpUtil = new HttpUtil();
            }
        }
        return mHttpUtil;
    }

    public RestAPIService getService() {
        return mService;
    }

    private OkHttpClient getOkHttpClient() {
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();

        if (GlobalConfig.CONFIG_DEBUG)
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        else
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);

        OkHttpClient.Builder httpClientBuilder = new OkHttpClient
                .Builder();
        httpClientBuilder.addInterceptor(loggingInterceptor)
                .addInterceptor(mTokenInterceptor)
                .addNetworkInterceptor(new StethoInterceptor());

        //httpClientBuilder.addNetworkInterceptor(loggingInterceptor);
        return httpClientBuilder.build();
    }

    private boolean shouldAddToken(String url) {
        return !url.contains("api/login");
    }

    private boolean alreadyHasAuthorizationHeader(Request request) {
        return request.header("Authorization") != null;
    }

    // Interceptor used for inserting token into Header
    private Interceptor mTokenInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request;
            Request originalRequest = chain.request();

            //request = originalRequest.newBuilder().addHeader("Connection", "close").build();
            request = originalRequest;
            String token = UserDataRepository.getInstance().getToken();
            if (token == null || token.length() == 0 || alreadyHasAuthorizationHeader(originalRequest)) {
                return chain.proceed(originalRequest);
            }

            if (shouldAddToken(originalRequest.url().toString())) {
                request = request.newBuilder()
                        .header("Authorization", "JWT " + token)
                        .build();
            }
            return chain.proceed(request);
        }
    };




  @Headers({"Content-Type: application/json", "Accept: application/json"})
    @GET("api/order")
    Observable<List<Order>> getOrder();
android json retrofit
2个回答
0
投票

现在回答有点晚了,但是如果有人有同样的问题,我会告诉你我是如何解决的。

我遇到了同样的错误,响应的最后一个字符丢失了,但是当使用邮递员测试 api 时一切都很好,所以我尝试使用其他 api 执行相同的代码并且它有效。

问题是服务器,我使用的是laravel服务器,所以我安装并配置了apache,问题解决了。


-1
投票

我也有同样的问题。 30% 的回复中缺少 JSON 的最后一个字符。我也尝试过使用邮递员,但没有发生错误。

我现在发现它只发生在模拟器上。对于通过 ADB 的物理设备,不会发生错误。

如果有人知道如何修复模拟器中的错误,我会很高兴。

© www.soinside.com 2019 - 2024. All rights reserved.