2017-03-20 11 views
-1

を配置しようとしています。GoogleアナリティクスAPIの構造体にjson配列を配置しようとしています。キーと値を使わないGolangの非整列配列で

EG:

"rows": [ 
    [ 
     "female", 
     "18-24", 
     "1308" 
    ], 
    [ 
     "female", 
     "25-34", 
     "741" 
    ] 
] 

私はjson:"gender"を置くことができますが、関連付ける全くキーが存在しないので、それは変更を探しますので、値は通常、私は、キー/値を持っていると思います。

構造体は次のようになります。

type Row struct { 
    Gender string `json:"gender"` 
    AgeRange string `json:"blah"` 
    Count string `json:"blah"` 
} 

私がlen(jResp.Rows)を行う場合、私はそれがすべての12の行/列をつかんだが、フィールドが空であることがわかります。

答えて

1

私が直接あなたの最初のタイプにUnmarshalJSON方法を実現せずに構造体のスライスにそのJSONをデコードするencoding/jsonで、それが可能だとは思いません。

func (r *Row) UnmarshalJSON(data []byte) error { 
    var s []string 
    if err := json.Unmarshal(data, &s); err != nil { 
      return err 
    } 
    if len(s) >= 3 { 
     r.Gender = s[0] 
     r.AgeRange = s[1] 
     r.Count = s[2] 
    } 
    return nil 
} 

// make sure it's a slice of pointers to Row 
type Resp struct { 
    Rows []*Row `json:"rows"` 
} 

編集:それは実際にコンパイルするために少しのコードを修正しました。作業例https://play.golang.org/p/eqVQj65xJvがあります。

また、データを最初にストリングのスライスにデコードし、その結果をループして構造体の値を構築することもできます。

type Resp struct { 
    Rows [][]string `json:"rows"` 
} 

type Row struct { 
    Gender string `json:"gender"` 
    AgeRange string `json:"blah"` 
    Count string `json:"blah"` 
} 

var resp jResp 
if err := json.Unmarshal(data, &resp); err != nil { 
    panic(err) 
} 

var rows = make([]Row, len(resp.Rows)) 
for i, r := range resp.Rows { 
    rows[i] = Row{ 
     Gender: r[0], 
     AgeRange: r[1], 
     Count: r[2], 
    } 
} 

編集:だけでなく、このいずれかを修正しました。 https://play.golang.org/p/Otb7iULSh3

関連する問題