#java #android #json #mapbox #mapbox-android
#java #Android #json #mapbox #mapbox-android
Вопрос:
Я использую MapBox REST API на стороне сервера для создания маршрута. Вот упрощенный код:
public class MapBoxRequest {
// using string pattern just for convenience
private static final String PATTERN =
"https://api.mapbox.com/directions/v5/mapbox/walking/%s,%s;%s,%s?alternatives=trueamp;geometries=geojsonamp;steps=trueamp;access_token=%s";
public static void main(String[] args) throws IOException, URISyntaxException {
HttpRequestFactory requestFactory = new NetHttpTransport().createRequestFactory();
String accessToken =
"access_toekn";
// set right location values
String string = String.format(PATTERN, longitude1, latitude1, longitude2, latitude2, accessToken);
URI uri = new URI(string);
HttpRequest request = requestFactory.buildGetRequest(new GenericUrl(uri.toString()));
String rawResponse = request.execute().parseAsString();
// HERE I AM GETTING EXCEPTION, THIS CODE IS SUPPOSED TO BE CALLED IN ANDROID APP
DirectionsResponse.fromJson(rawResponse);
}
}
с помощью этих зависимостей maven:
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client</artifactId>
<version>1.38.0</version>
</dependency>
<dependency>
<groupId>com.mapbox.mapboxsdk</groupId>
<artifactId>mapbox-sdk-services</artifactId>
<version>5.6.0</version>
</dependency>
Но когда я пытаюсь проанализировать DirectionsResponse
класс из строки, я получаю следующее исключение:
Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected
a string but was BEGIN_OBJECT at line 1 column 546 path $.routes[0].legs[0].steps[0].geometry
at com.google.gson.Gson.fromJson(Gson.java:939)
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)
at com.mapbox.api.directions.v5.models.DirectionsResponse.fromJson(DirectionsResponse.java:133)
at dating.walking.service.walking.setup.MapBoxRequest.main(MapBoxRequest.java:34)
Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 546 path $.routes[0].legs[0].steps[0].geometry
at com.google.gson.stream.JsonReader.nextString(JsonReader.java:825)
Приведенный выше код является примером. На практике клиенты Android / iOS должны загружать этот JSON, анализировать его и использовать в навигации MapBox Navigation SDK
. Дело в том, что в приложении для Android я получаю то же исключение, что и приведенное выше.
Мой вопрос — как я могу создать маршрут на серверной стороне, отправить его клиенту в виде json, проанализировать JSON и начать навигацию?
Ответ №1:
Использование MapBox Java SDK
библиотеки вместо MapBox REST API
и настройка Gson
помогли мне сериализовать и десериализовать ReponseRoute
класс.
Вот упрощенный код:
public class MapBoxSdkSample {
public static void main(String[] args) {
String accessToken = "*****";
Point originPoint = Point.fromLngLat(**, **);
Point destinationPoint = Point.fromLngLat(**, **);
MapboxDirections client =
MapboxDirections.builder()
.origin(originPoint)
.destination(destinationPoint)
.overview(DirectionsCriteria.OVERVIEW_FULL)
.profile(DirectionsCriteria.PROFILE_WALKING)
.accessToken(accessToken)
.build();
client.enqueueCall(
new Callback<>() {
@Override
public void onResponse(
Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
// boilerplate code
if (response.body() == null) {
System.out.println(
"No routes found, make sure you set the right user and access token.");
return;
} else if (response.body().routes().size() < 1) {
System.out.println("No routes found");
return;
}
DirectionsRoute directionsRoute = response.body().routes().get(0);
Gson gson =
new GsonBuilder()
.registerTypeAdapterFactory(DirectionsAdapterFactory.create())
.create();
String s1 = gson.toJson(directionsRoute);
// I wasn't getting exceptions here and the object was populated with data
DirectionsRoute parsedFromJsonRoute = gson.fromJson(s1, DirectionsRoute.class);
}
@Override
public void onFailure(Call<DirectionsResponse> call, Throwable throwable) {
System.out.println("Error: " throwable.getMessage());
}
});
}
}