取消对golang中的深层嵌套数组进行聚合



我正在尝试对"内部";"中的元素;"列表";,但只有最后一个";内部类型";恢复,即";c1〃:

jsonData := []byte(`{
"List": [{
"Inner":{"type":"a1"},      
"Inner":{"type":"b1"},
"Inner":{"type":"c1"}
}]}`)
type Test struct {
List []struct {
Inner struct {
Type string `json:"type"` 
} `json:"Inner"`
} `json:"List"`
}
var test Test
json.Unmarshal(jsonData, &test)
fmt.Println(test.List[0].Inner.Type)

那么,有没有办法把所有元素都打印在";列表">

您可能需要为[]List对象中的对象确定一种类型,并使用如下自定义逻辑实现JSONUnmarshaller接口来实现这一点。

package main
import (
"encoding/json"
"fmt"
"regexp"
"strings"
)
type Inner struct{
Type string `json:"type"`
}
type List []Inner
type Test struct {
List [] List `json:"List"`
}
func main() {
jsonData := []byte(`{
"List": [{
"Inner":{"type":"a1"},      
"Inner":{"type":"b1"},
"Inner":{"type":"c1"}
}]}`)
var test Test
err := json.Unmarshal(jsonData, &test)
if err != nil{
fmt.Println(err)
return
}
for _,v := range test.List[0]{
fmt.Println(v.Type)
}
}
func (l *List) UnmarshalJSON(bytes []byte) error {
out := make(List,0)
re := regexp.MustCompile(`"Inner":{.*}`)
objects := re.FindAll(bytes,-1)
for _,v := range objects{
inner := Inner{}
s := strings.TrimLeft(string(v),`"Inner":`)
err := json.Unmarshal([]byte(s),&inner)
if err != nil{
return err
}
out = append(out,inner)
}
*l = out
return nil
}

输出:

a1
b1
c1

在JSON:中,同一对象上不能有多个相同的键

console.log(JSON.parse(`{
"Inner":{"type":"a1"},      
"Inner":{"type":"b1"},
"Inner":{"type":"c1"}
}`))

因此,如果不编写自定义解组程序,则不会。

最新更新