简体   繁体   中英

Retrofit + RxJava2 access to JSON body before parsing it

I am using retrofit + RxJava2, i want to access to json body before parsing it via GSON library in retrofit, here is my code :

trafficApi
                .trafficControlDetails()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(application.defaultSubscribeScheduler())
                .subscribeWith(new DisposableObserver<TrafficDetailItem>()
                {
                    @Override
                    public void onNext(@io.reactivex.annotations.NonNull TrafficDetailItem trafficDetailItemJsonResponse)
                    {
                        SplashViewModel.this.trafficControlDetails = trafficDetailItemJsonResponse;
                    }

                    @Override
                    public void onError(@io.reactivex.annotations.NonNull Throwable e)
                    {
                        retryButtonVisibility.set(View.VISIBLE);
                        errorMessageVisibility.set(View.VISIBLE);
                        errorMessage.set(context.getString(R.string.connection_error_message));
                    }

                    @Override
                    public void onComplete()
                    {
                        retryButtonVisibility.set(View.INVISIBLE);
                        errorMessageVisibility.set(View.INVISIBLE);
                        saveData(trafficControlDetails);
                    }
                });

As you can see i receive parsed POJO in my observer, but i don't know how can i get pure JSON data as well.

I leave you an example how to request data and parse the Json content then create an observable from that content.

HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .GET()
                .uri(URI.create("http://dummy.restapiexample.com/api/v1/employees"))
                .timeout(Duration.ofSeconds(4))
                .build();
        try {
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            JsonObject jsonResponse = new JsonParser().parse(response.body()).getAsJsonObject();
            JsonArray data = jsonResponse.getAsJsonArray("data");
            Observable.fromIterable(data)
                    .filter(s -> {
                        JsonObject currentElement = s.getAsJsonObject();
                        Integer age = currentElement.get("employee_age").getAsInt();
                        return age >= 60;
                    })
                    .sorted((x,y) ->
                            Integer.compare(
                                    x.getAsJsonObject().get("employee_age").getAsInt(),
                                    y.getAsJsonObject().get("employee_age").getAsInt()))
                    .map(s -> {
                        JsonObject current = s.getAsJsonObject();
                        JsonObject result =  new JsonObject();
                        result.addProperty("name", current.get("employee_name").getAsString());
                        result.addProperty("age", current.get("employee_age").getAsInt());
                        result.addProperty("id", current.get("id").getAsInt());
                        result.addProperty("salary", current.get("employee_salary").getAsInt());
                        return result;
                    }).doOnError(s -> System.out.println("Map went wrong"))
                    .subscribe(s -> System.out.println(s), s -> System.out.println("error with " + s));
        } catch (Exception e) {
            System.out.println("error" +e.toString());
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM