Разбор JSON ответа от Google Maps - PullRequest
0 голосов
/ 11 марта 2020

Мне нужно было создать прокси-сервер для подключения к веб-сервисам Google Maps, и я нашел учебник, который делает около 95% того, что мне нужно. Учебник использует golang, я почти полностью новичок в golang, и если я точно буду следовать ему, он отлично работает. Но в тот момент, когда я пытаюсь что-то изменить из учебника, я явно что-то напутал, смеется.

Проблема, которая мне сейчас нужна, заключается в том, что учебник анализирует только 2 переменные из ответа google-maps, широта и долгота. Для остальной части моего приложения мне ТАКЖЕ нужен идентификатор места.

Я получаю ответ от google-maps, не проблема. Если я проанализирую его как

type placeResults struct {
    Results []struct {
        Geometry struct {
            Location struct {
                Lat float64 `json:"lat"`
                Lng float64 `json:"lng"`
            } `json:"location"`
        } `json:"geometry"`
    } `json:"results"`
}

Он работает нормально и дает мне широту и долготу, не беспокойтесь.

Но если я вместо этого попробую,

type placeResults struct {
    Results []struct {
        Geometry struct {
            Location struct {
                Lat float64 `json:"lat"`
                Lng float64 `json:"lng"`
            } `json:"location"`
        } `json:"geometry"`
        id struct {
            Id string `json:"id"`
        }
    } `json:"results"`
}

Это говорит мне:

json: невозможно разархивировать строку в Go поле структуры. Идентификатор типа struct {Id string "json: \" id \ ""}

Теперь переменная id не является частью геометрии, но является обобщенной c частью ответа, поэтому я решил, что это будет правильный синтаксис. Очевидно, я не прав. Но какой правильный синтаксис для включения этого?

1 Ответ

1 голос
/ 11 марта 2020

Ответ API Google Place выглядит следующим образом:

      "geometry" : {
         "location" : {
            "lat" : -33.866651,
            "lng" : 151.195827
         },
         "viewport" : {
            "northeast" : {
               "lat" : -33.8653881697085,
               "lng" : 151.1969739802915
            },
            "southwest" : {
               "lat" : -33.86808613029149,
               "lng" : 151.1942760197085
            }
         }
      },
      "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png",
      "id" : "4f89212bf76dde31f092cfc14d7506555d85b5c7",

Поэтому вам нужно объявить поле id как строку, а не struct. Вам нужно изменить структуру placeResult.

type modifiedPlaceResult struct {
    Geometry struct {
        Location struct {
            Lat float64 `json:"lat"`
            Lng float64 `json:"lng"`
        } `json:"location"`
    } `json:"geometry"`

    Id string `json:"id"`
}

попробуйте использовать модифицированную структуру PlaceResult для демаршалинга данных, все будет хорошо. Я приложил пример с Go детской площадки: https://play.golang.org/p/Q4rM-jluoFe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...