将嵌套的JSON解析为struct?

时间:2016-07-25 23:00:07

标签: json parsing go

我想解析以下JSON输出:

{
    "total":5689,
    "result":{
        "6581":{
            "percent":37.79,
            "count":2150
        },
        "6591":{
            "percent":35.31,
            "count":2009
        },
        "6601":{
            "percent":26.89,
            "count":1530
        }
    }
}

我已经读过,如果格式已知,可以将JSON解析为结构:

package main

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

type VoteResult struct {
    Total  int `json:"total"`
    Result struct {
        Efid1 struct {
            Percent float64 `json:"percent"`
            Count   int     `json:"count"`
        }
        Efid2 struct {
            Percent float64 `json:"percent"`
            Count   int     `json:"count"`
        }
        Efid3 struct {
            Percent float64 `json:"percent"`
            Count   int     `json:"count"`
        }
    }
}

func main() {
    b := []byte(`{"total":5689,"result":{"6581":{"percent":37.79,"count":2150}
    ,"6591":{"percent":35.31,"count":2009},"6601":{"percent":26.89,"count":1530}}}`)

    var v VoteResult

    err := json.Unmarshal(b, &v)
    if err != nil {
        fmt.Fprintf(os.Stderr, "%v\n", err)
        os.Exit(1)
    }

    fmt.Println(v)
}

Go Playground

这是输出,但是由于嵌套的结构没有填充数据,所以有些错误:

{5689 {{0 0} {0 0} {0 0}}}

我做错了什么?

1 个答案:

答案 0 :(得分:1)

JSON的result部分是将字符串映射到对象的字典。请改为尝试(https://play.golang.org/p/BCNHw-OH2I):

type VoteResult struct {
    Total  int `json:"total"`
    Result map[string]struct {
        Percent float64 `json:"percent"`
        Count   int     `json:"count"`
    }
}

修改

作为替代方案,如果这些字符串是真正修复的,您可以这样做:

type VoteResult struct {
    Total  int `json:"total"`
    Result struct {
        Efid1 struct {
            Percent float64 `json:"percent"`
            Count   int     `json:"count"`
        } `json:"6581"`
        Efid2 struct {
            Percent float64 `json:"percent"`
            Count   int     `json:"count"`
        } `json:"6591"`
        Efid3 struct {
            Percent float64 `json:"percent"`
            Count   int     `json:"count"`
        } `json:"6601"`
    }
}

这里我们刚刚决定Efid1有JSON键6591等等。但是我怀疑字符串到结构的映射更适合你拥有的数据结构。