Golang массив unmarshaling дает ошибку времени выполнения: индекс выходит за пределы диапазона - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть json данные, которые я получаю от этого api . Соответствующие части json выглядят так:

{
   "features": [
     {
       "properties": {
         "display_name": "name", 
         "address": {"county": "County", "country":"country", "country_code":"cc"}
       },
       "bbox": [13.9171885,44.2603464,15.2326512,45.6729436],
       "geometry": {
          "coordinates": [
             [
               [14.4899021,41.4867039],
               [14.5899021,41.5867039]
             ]
          ]
        }
     }
   ]
}

Я пытаюсь разобрать его с помощью такой структуры:

type Feature struct {
    Properties struct {
        Name    string `json:"display_name"`
        Address struct {
            Country string `json:"country"`
            Code    string `json:"country_code"`
        } `json:"address"`
    } `json:"properties"`
    Bbox []float64 `json:"bbox"`
    Geo  struct {
        Coordinates [][][]float64 `json:"coordinates"`
    } `json:"geometry"`
}

type Entry struct {
    Features []Feature `json:"features"`
}

Но если я запустил это:

var entry Entry

if err := json.Unmarshal(bytes, &entry); err != nil {
    fmt.Println("Error parsing json", err)
}

Я получаю сообщение об ошибке:

Error parsing json json: cannot unmarshal array into Go value of type controllers.Entry
2020/04/28 17:36:39 http: panic serving [::1]:61457: runtime error: index out of range

Что я делаю не так, как мне разобрать этот тип json?

1 Ответ

0 голосов
/ 29 апреля 2020

Как отмечает @mkopriva, проблема, скорее всего, в получении bytes. Следующее дает ожидаемый результат:

package main

import (
    "encoding/json"
    "fmt"
)

type Feature struct {
    Properties struct {
        Name    string `json:"display_name"`
        Address struct {
            Country string `json:"country"`
            Code    string `json:"country_code"`
        } `json:"address"`
    } `json:"properties"`
    Bbox []float64 `json:"bbox"`
    Geo  struct {
        Coordinates [][][]float64 `json:"coordinates"`
    } `json:"geometry"`
}

type Entry struct {
    Features []Feature `json:"features"`
}

var data = `{
   "features": [
     {
       "properties": {
         "display_name": "name",
         "address": {"county": "County", "country":"country", "country_code":"cc"}
       },
       "bbox": [13.9171885,44.2603464,15.2326512,45.6729436],
       "geometry": {
          "coordinates": [
             [
               [14.4899021,41.4867039],
               [14.5899021,41.5867039]
             ]
          ]
        }
     }
   ]
}`

func main() {
    var entry Entry

    bytes := []byte(data)
    if err := json.Unmarshal(bytes, &entry); err != nil {
        fmt.Println("Error parsing json", err)
    }

    fmt.Printf("%v\n", entry)
}

И результат:

{[{{name {country cc}} [13.9171885 44.2603464 15.2326512 45.6729436] {[[[14.4899021 41.4867039] [14.5899021 41.5867039]]]}}]}

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