googlemaps / google-maps-services-java

Java client library for Google Maps API Web Services
Apache License 2.0
1.71k stars 945 forks source link

Places: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 408 column 36 path $.result.secondary_opening_hours #906

Open MattWilliams89 opened 1 year ago

MattWilliams89 commented 1 year ago

Environment details

OS type and version: Gradle JDK: jbr-17, 17.0.6 Kotlin JVM: 1.8.0

Library version and other environment information: com.google.maps:google-maps-services:2.2.0

Running on Ktor server v 2.2.3

Steps to reproduce

  1. Make a call to PlacesApi.placeDetails with placeId ChIJTSQM7Smze0gR627zU4Cvkn4

Code example

return try {
            val response = PlacesApi.placeDetails(GoogleApiClient.context, id).await()
        } catch (e: Throwable) {
            PlacesDetailClientResponse.Error
        }

Stack trace

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 408 column 36 path $.result.secondary_opening_hours

Following these steps will guarantee the quickest resolution possible.

Thanks!

wangela commented 1 year ago

If you would like to upvote the priority of this issue, please comment below or react with :+1: so we can see what is popular when we triage.

@MattWilliams89 Thank you for opening this issue. 🙏 Please check out these other resources that might help you get to a resolution in the meantime:

This is an automated message, feel free to ignore.

deansg commented 1 year ago

I have received the same issue when using Java 17, and sending a request for place with id ChIJhbDp64aLGGAR5ywd2IRem7Q

According to the official API documentation here, the secondary_opening_hours field is an Array, which seems to be the cause of the problem

tomag commented 1 year ago

I bypassed this bug by excluding the secondary_opening_hours field -

        PlaceDetailsRequest request = PlacesApi.placeDetails(geoApiContext, placeId);

        request.fields(Arrays.stream(PlaceDetailsRequest.FieldMask.values())
                .filter(x -> x != PlaceDetailsRequest.FieldMask.SECONDARY_OPENING_HOURS)
                .toArray(PlaceDetailsRequest.FieldMask[]::new));

        PlaceDetails response = request.await();
asloup commented 1 year ago

Here's the same thing in Kotlin if anybody needs it:

        val request = PlacesApi.placeDetails(geoApiContext, placeId)
        val fields = HashSet<PlaceDetailsRequest.FieldMask>()
        fields.addAll(PlaceDetailsRequest.FieldMask.values())
        fields.remove(PlaceDetailsRequest.FieldMask.SECONDARY_OPENING_HOURS)
        request.fields(*fields.toTypedArray())
        val placeDetails: PlaceDetails? = try {
            request.await()
        } catch (e: Exception) {
            println("refreshPlaces - Google Places SDK exception - PlacesApi.placeDetails() - placeId = ${placeId}, error = ${e.message}")
        }