Преобразовать из json Строка объекта в Java Объект om.google.gson.JsonSyntaxException - PullRequest
0 голосов
/ 17 января 2020

У меня вопрос по поводу разбора строки на java объект. У меня есть этот ответ:

{
    "status": "success",
    "paginated": false,
    "data": [{
        "user": {
            "id": 21,
            "email": "kjhk@gmail.com",
            "access_token": "ai_wy-tTLLEyRCPAF86dWPJdQ77gefsTPwBkvtlEkNs",
            "test": []
        }
    }],
    "message": ""
}

И я хочу получить статус

Я создал этот класс и установил только статус, так как это единственное поле, которое я хочу, и все остальные ответ не важен

package responseObjects;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.ArrayList;
import java.util.List;

public class LogInResponse {



    @JsonIgnoreProperties(ignoreUnknown = true)
    @JsonProperty("status")
    public String status;


    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

}

В программе я отправляю запрос и получаю ответ, однако, когда я пытаюсь установить его как java объект, он потерпел неудачу в этой строке LogInResponse res = gson.fromJson(response.body().toString(),LogInResponse.class);

public class TestMain {
    OkHttpClient client = new OkHttpClient();
    JsonObject bodyJson = new JsonObject();
    JsonObject responseJson = new JsonObject();

    MediaType JSON = MediaType.parse("application/json; charset=utf-8");

  public String httpPost(String url, String json) throws IOException {
        RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Response response = client.newCall(request).execute();
        String  strResponse = response.body().string();
      JsonObject jsonObjectResponse = new JsonParser().parse(strResponse).getAsJsonObject();
    Gson gson = new Gson();
    LogInResponse res = gson.fromJson(response.body().toString(),LogInResponse.class);
        return response.body().string();
    }

это исключение

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
    at com.google.gson.Gson.fromJson(Gson.java:927)
    at com.google.gson.Gson.fromJson(Gson.java:892)
    at com.google.gson.Gson.fromJson(Gson.java:841)
    at com.google.gson.Gson.fromJson(Gson.java:813)

Может кто-нибудь посоветовать, что не так? как я могу получить статус из ответа? С уважением

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Из документации OkHttp о body()

Возвращает ненулевое значение, если этот ответ был передан Callback.onResponse или возвращен из Call.execute. Тела ответа должны быть закрыты и могут быть использованы только один раз.

То есть вы используете его дважды три раза (включая ваше заявление о возврате) , У вас уже есть это внутри strResponse. Продолжайте использовать это. И close() это, пока вы у него.

0 голосов
/ 17 января 2020

В вашем коде вы используете response.body().string() для получения строки JSON, но в ошибочной строке вы пишете response.body().toString(), что является другим методом.

...