2013-07-29 11 views
1

這是我的代碼錯誤轉到解組JSON是一個數組開始

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.Data

回答

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"}}}} 
+0

您的答案使用了JSON的修改版本,而不是原始版本 – jwesonga

+0

@jwesonga:您的JSON數據與您設計的Go類型不是(直接)兼容。您必須使JSON適應所使用的Go數據結構,反之亦然。誰可以知道你喜歡哪種方式? ;-) – zzzz

+0

原始的json,但修改結構,我認爲CountriesList應該變成一個切片..我遠沒有靠近計算機來測試這一點,雖然.. – jwesonga

1

我得到了一些幫助,從#去螺母上IRC:

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) 
    } 
} 
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列出了幾種不同的選項非常有用。