Golang Unmarshal Json没有解析所有子结构

dldeef67  于 2023-04-09  发布在  Go
关注(0)|答案(1)|浏览(156)

我有一个父结构和两个子结构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
1l5u6lss

1l5u6lss1#

我测试了它,我认为这是一个结构问题,我不知道你是否可以改变你的json结构,但如果是的,你可以尝试只使用2个结构,有一个进化的结构

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
    }
}

希望有帮助

相关问题