在以数组开头的Go中解组JSON中的JSON时出错

时间:2013-07-29 13:53:29

标签: json go

这是我的代码

package main

import (
    "encoding/json"
    "log"
)

type Data struct {
    Page          int
    Pages         int
    PerPage       string
    Total         int
    CountriesList []Country
}
type Country struct {
    Id  string
    Iso string
}

func main() {
    body := []byte(`[
    {
        "page": 1,
        "pages": 6,
        "per_page": "50",
        "total": 256
    },
    [
        {
            "id": "ABW",
            "iso2Code": "AW"}]]`)

    items := make([]Data, 10)

    if err := json.Unmarshal(body, &items); err != nil {
        log.Fatalf("error %v", err)
    }
}

我尝试解组一些JSON并收到以下错误: 错误json:无法将数组解组为main类型的Go值。数据

3 个答案:

答案 0 :(得分:2)

在阅读问题时,我假设可能有多个数据+国家/地区对列表。这是我最终得到的解决方案:

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

type Data struct {
    Page    int
    Pages   int
    PerPage string `json:"per_page, string"`
    Total   int
}
type Country struct {
    Id       string
    Iso2Code string
}

type DataCountry struct {
    Data        Data
    CountryList []Country
}

func main() {
    body := []byte(`[
    {
        "page": 1,
        "pages": 6,
        "per_page": "50",
        "total": 256
    },
    [
        {
            "id": "ABW",
            "iso2Code": "AW"}]
]`)

    raw := make([]json.RawMessage, 10)
    if err := json.Unmarshal(body, &raw); err != nil {
        log.Fatalf("error %v", err)
    }

    sdc := make([]DataCountry, 0)
    for i := 0; i < len(raw); i += 2 {
        dc := DataCountry{}

        data := Data{}
        if err := json.Unmarshal(raw[i], &data); err != nil {
            fmt.Println("error %v", err)
        } else {
            dc.Data = data
        }

        var countries []Country
        if err := json.Unmarshal(raw[i+1], &countries); err != nil {
            fmt.Println("error %v", err)
        } else {
            dc.CountryList = countries
        }

        sdc = append(sdc, dc)
    }
    fmt.Printf("%v\n", sdc)
}

我发现博客文章"Using go to unmarshal json lists with multiple types"对于理解处理解析JSON列表的几个不同选项非常有用。

答案 1 :(得分:1)

package main

import (
        "encoding/json"
        "fmt"
        "log"
)

type Data struct {
        Page          int
        Pages         int
        Per_Page      string
        Total         int
        CountriesList []Country
}
type Country struct {
        Id       string
        Iso2Code string
}

func main() {
        body := []byte(`
        [
                {
                        "page": 1,
                        "pages": 6,
                        "per_page": "50",
                        "total": 256,
                        "countrieslist": [
                                {
                                    "id": "ABW",
                                    "iso2Code": "AW"
                                }
                        ]
                }
        ]
`)

        items := make([]Data, 10)

        if err := json.Unmarshal(body, &items); err != nil {
                log.Fatalf("error %v", err)
        }

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

Playground


输出:

[]main.Data{main.Data{Page:1, Pages:6, Per_Page:"50", Total:256, CountriesList:[]main.Country{main.Country{Id:"ABW", Iso2Code:"AW"}}}}

答案 2 :(得分:1)

我在IRC的#go-nuts得到了一些帮助:

package main


import (
  "encoding/json"
  "fmt"
  "log"
)

type T1 struct {
  Page, Pages, Total int
  PerPage            int `json:"per_page,string"`
}

type T2 struct {
  ID       string
  ISO2Code string
}

func main() {
  body := []byte(`
    [
      {
        "page": 1,
        "pages": 6,
        "per_page": "50",
        "total": 256
      },
      [
        {
          "id": "ABW",
          "iso2Code": "AW"
        },
        {
          "id": "AFG",
          "iso2Code": "AF"
        }
      ]
    ]
  `)

  t1 := T1{}
  t2 := []T2{}

  if err := json.Unmarshal(body, &[]interface{}{&t1, &t2}); err != nil {
    log.Fatalf("error %v", err)
  }

  fmt.Printf("%#v  %#v", t1, t2)
  for k, v := range t2 {
    fmt.Printf("%v %v\n",k, v.ID)
  }
}