java.lang.Исключение IllegalStateException при анализе строкового ответа Json с использованием Gson()

#java #json #gson #google-places-api

Вопрос:

Я работаю с API Google Places, чтобы получить информацию о findplacefromtext конечной точке места. Вот код, с которым я работаю, чтобы сделать запрос

 OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
Request request = new Request.Builder()
        .url("https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=Museum of Contemporary Art Australiaamp;inputtype=textqueryamp;fields=formatted_address,name,ratingamp;key=API_KEY")
        .method("GET", null)
        .build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
 

Приведенный выше код выводит правильный ответ, который выглядит следующим образом:

 {
   "candidates" : [
      {
         "formatted_address" : "140 George St, The Rocks NSW 2000, Australia",
         "name" : "Museum of Contemporary Art Australia",
         "rating" : 4.4
      }
   ],
   "status" : "OK"
}
 

Я хочу проанализировать этот ответ и поместить его в объект, который я смогу использовать позже, поэтому я решил использовать для него Gson.

 Gson gson = new Gson();
try {
    CandidateResponseTest responseMapper = gson.fromJson(response.body().string(), CandidateResponseTest.class);
    List<Candidate> listResult = responseMapper.getCandidates();
    for (Candidate r : listResult) {
        System.out.println("Fetched name: "   r.getName());
    }
} catch (Exception e){
    e.printStackTrace();
}
 

Этот фрагмент кода java.lang.IllegalStateException создает исключение там, где в строке, которая имеет gson.fromJson . Из результата инструкции печати, показанного выше, я знаю, что response.body().string он не пустой.

 java.lang.IllegalStateException: closed
    at okio.RealBufferedSource.select(RealBufferedSource.kt:218)
    at okhttp3.internal.Util.readBomAsCharset(Util.kt:258)
    at okhttp3.ResponseBody.string(ResponseBody.kt:187)
    at org.example.PlaceSearch.getPlaceTest(PlaceSearch.java:61)
    at org.example.App.main(App.java:15)
 

Вот как candidateResponse это выглядит:

 public class CandidateResponseTest {

    @SerializedName("candidates")
    private List<Candidate> candidates;

    public List<Candidate> getCandidates(){
        return this.candidates;
    }
}
 

и вот как Candidate это выглядит:

 public class Candidate{
    public String getAddress() {
        return address;
    }

    @SerializedName("formatted_address")
    private String address;

    public String getName() {
        return name;
    }

    @SerializedName("name")
    private String name;

    public String getRating() {
        return rating;
    }

    @SerializedName("rating")
    private String rating;


}
 

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

Комментарии:

1. Пожалуйста, добавьте полную трассировку стека исключения к вашему вопросу.

2. Я не запускал ваш код, но я заметил, что рейтинг-это не строка, и этот статус отсутствует.

3. Я добавил status и изменил rating , чтобы быть двойным, но все равно вижу ту же ошибку.

4. @tgdavies добавил полную трассировку стека

5. square.github.io/okhttp/3.x/okhttp/okhttp3/ResponseBody.html «Поскольку этот класс не буферизует полный ответ в памяти, приложение не может повторно прочитать байты ответа».