Golang的Unmarshal Json无法解析所有子结构。

3
我有一个父结构和两个子结构ResponseA和ResponseB。我为ParentA结构编写了“UnmarshalJson”函数。但是,parentB结构和字符串字段无法解析。我该如何编写自定义的Unmarshal函数,仅解析指定的结构?
type ResponseA struct {
    PageA    int      `json:"pageA"`
    EntriesA []string `json:"entriesA"`
}

type ResponseB struct {
    PageB    int      `json:"pageB"`
    EntriesB []string `json:"entriesB"`
}

type ResponseParent struct {
    ResponseA
    ResponseB
    PageC int `json:"pageC"`
}

func (r *ResponseA) UnmarshalJSON(data []byte) error {
// UnMarshal ResponseA structure        
}

func main() {

    jsonStr := `{"pageA": 1, "entriesA": ["classA"], "pageB": 2, "entriesB": 
    ["classC","classD"], "pageC":3}`
    // str := `{"page": 1, "entries": ["classA", "classB"]}`

    var res *ResponseParent
    json.Unmarshal([]byte(jsonStr), &res)
    entriesA := res.EntriesA
    pageA := res.PageA
    entriesB := res.EntriesB
    pageB := res.PageB
    pageC := res.PageC

    fmt.Println("========Response A==========a")
    fmt.Println("PageA: %v", pageA)
    fmt.Println("EntriesA: %v", entriesA)
    fmt.Println("========Response B==========a")
    fmt.Println("PageB: %v", pageB)
    fmt.Println("EntriesB: %v", entriesB)
    fmt.Println("PageC: %v", pageC)
}

OutPut:

========Response A==========a
PageA: %v 1
EntriesA: %v [classA]
========Response B==========a
PageB: %v 0
EntriesB: %v []
PageC: %v 0
1个回答

3
我测试了它,认为这是一个结构性问题。不知道你能否更改你的json结构。如果可以的话,你可以尝试只使用两个struct来拥有一个进化的结构。
type Response struct {
Page    int      `json:"page"`
Entries []string `json:"entries"`}
}

type GlobalResponse struct {
    ResponseA Response `json:"pageA"`
    ResponseB Response `json:"pageB"`
    ResponseC Response `json:"pageC"`
}

然后这样访问:

var res *GlobalResponse
json.Unmarshal([]byte(jsonStr), &res)
entriesA := res.ResponseA.Entries
pageA := res.ResponseA.Page
// Etc for each page...

最后,JSON必须更改为该结构

{
    "pageA":{
        "page":1,
        "entries":[
            "classA"
        ]
    },
    "pageB":{
        "page":2,
        "entries":[
            "classC",
        "classD"
        ]
    },
    "pageC":{
        "page":3
    }
}

希望它有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接