Golang - 解析嵌套的 json 值

我有一个看起来像这样的 json 数据:


    [

      {

        lat: "41.189301799999996",

        lon: "11.918255998031015",

        display_name: "Some place",

        address: {

          address: "Address",

          country: "Country",

          country_code: "CC"

        },

        geojson: {

          type: "Polygon",

          coordinates: [

             [

               [14.4899021,41.4867039],

               [14.5899021,41.5867039],

             ]

          ]

        }

     }

   ]

我想解析这些数据,从这个数组中获取第一个元素并将其转换为一个新的结构,如下所示:


type Location struct {

    Name        string

    Country     string

    CountryCode string

    Center      Coordinate

    Coordinates []Coordinate

}

我已经定义了这样的坐标类型:


type Coordinate struct {

    Lat string `json:"lat"`

    Lng string `json:"lon"`

}

但是,如果尝试这样解析:


bytes, err := ioutil.ReadAll(res.Body)


if err != nil {

    http.Error(w, err.Error(), http.StatusBadRequest)

}


var locations [0]Location


if err := json.Unmarshal(bytes, &locations); err != nil {

    fmt.Println("Error parsing json", err)

}


fmt.Println(locations)

但是,这在终端中给了我这个:


[{   { } []}]

如何解析这种json结构并将其转换为location那种结构?


慕村225694
浏览 266回答 2
2回答

沧海一幻觉

您应该使用与输入文档匹配的结构来解组:type Entry struct {  Lat string `json:"lat"`  Lon string `json:"lon"`  DisplayName string `json:"display_name"`  Address struct {      Address string `json:"address"`      Country string `json:"country"`      Code string `json:"country_code"`  } `json:"address"`  Geo struct {     Type string `json:"type"`     Coordinates [][][]float64 `json:"coordinates"`  } `json:"geojson"`}然后解组为一个条目数组:var entries []Entryjson.Unmarshal(data,&entries)并且,用于entries构造Locations

MM们

您需要对 Unmarshal 的结构更加精确。根据官方 JSON 规范,您还需要在密钥周围加上双引号。省略引号仅适用于 JavaScript,JSON 需要这些。最后一件事,我知道这很愚蠢,但是最后一个内部数组之后的最后一个逗号也是无效的,必须删除它:package mainimport (    "encoding/json"    "fmt")type Location struct {    Lat         string     `json:"lat"`    Lng         string     `json:"lon"`    DisplayName string     `json:"display_name"`    Address     Address    `json:"address"`    GeoJSON     Geo        `json:"geojson"`}type Address struct {    Address     string `json:"address"`    Country     string `json:"country"`    CountryCode string `json:"country_code"`}type Geo struct {    Type        string         `json:"type"`    Coordinates [][]Coordinate `json:"coordinates"`}type Coordinate [2]float64func main() {    inputJSON := `    [          {            "lat": "41.189301799999996",            "lon": "11.918255998031015",            "display_name": "Some place",            "address": {              "address": "123 Main St.",              "country": "USA",              "country_code": "+1"            },            "geojson": {              "type": "Polygon",              "coordinates": [                [                  [14.4899021,41.4867039],                  [14.5899021,41.5867039]                ]              ]            }          }        ]`    var locations []Location    if err := json.Unmarshal([]byte(inputJSON), &locations); err != nil {        panic(err)    }    fmt.Printf("%#v\n", locations)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go