-->

Unmarshall nested JSON Arrays in Go / Golang

2019-09-19 05:26发布

问题:

Hi I have problem with unmarshalling nested JSON arrays. What struct should I create? I want to avoid using interface{} as much as possible, but I really don't know if it is possible in this case.

Json I want to unmarshall:

"[[[{\"aaa\": \"aaa\"}]]]"

and struct I want to use to unmarshall this:

type SomeStructNestedNested struct {
   Aaa string `json:"aaa"`
}
type SomeStructNested struct {
   SomeStructNestedNested []SomeStructNestedNested
}
type SomeStruct struct {
   SomeStructNested []SomeStructNested
}

Link to example: https://play.golang.org/p/owuMptNrix

回答1:

Yes the answer is just an slice of slices:

type AutoGenerated [][][]struct {
     Aaa string `json:"aaa"`
}

Well thanks to your question I've discovered a bug in this tool I always use it for Json manipulation with Go, it can save you a lot of boring time, also it's better to use ticks `` to represent json strings like here



回答2:

The problem here is that you're attempting to use structs to represent the nesting when they're actually arrays. I find the form of the json itself to be quite poor but if you're stuck with it then you have to have a 3d array for the unmarshal, using just that 'nested nested' struct type. Below is link to your play example with some crude modifications to demonstrate the point.

type SomeStructNestedNested struct {
    Aaa string `json:"aaa"`
}

jsonString := "[[[{\"aaa\": \"aaa\"}]]]"
d := [][][]SomeStructNestedNested{}
json.Unmarshal([]byte(jsonString), &d)
fmt.Printf("%v", d)

https://play.golang.org/p/88M0_UR_3_