为了账号安全,请及时绑定邮箱和手机立即绑定

Golang - 解析嵌套的 json 值

Golang - 解析嵌套的 json 值

Go
慕村225694 2022-06-01 15:10:48
我有一个看起来像这样的 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]Locationif err := json.Unmarshal(bytes, &locations); err != nil {    fmt.Println("Error parsing json", err)}fmt.Println(locations)但是,这在终端中给了我这个:[{   { } []}]如何解析这种json结构并将其转换为location那种结构?
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

您应该使用与输入文档匹配的结构来解组:


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 []Entry

json.Unmarshal(data,&entries)

并且,用于entries构造Locations


查看完整回答
反对 回复 2022-06-01
?
MM们

TA贡献1886条经验 获得超2个赞

您需要对 Unmarshal 的结构更加精确。根据官方 JSON 规范,您还需要在密钥周围加上双引号。省略引号仅适用于 JavaScript,JSON 需要这些。


最后一件事,我知道这很愚蠢,但是最后一个内部数组之后的最后一个逗号也是无效的,必须删除它:


package main


import (

    "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]float64


func 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)

}


查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 265 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信