#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 «Поскольку этот класс не буферизует полный ответ в памяти, приложение не может повторно прочитать байты ответа».