我在golang中解析JSON时出现问题,我从JSON格式接收来自API的响应,它在多个级别中嵌套相同形式的JSON。
API的响应如下
{
"podKategoria": {
"podKategoriaTyp": "area",
"nazwaWyswietlana": "Area",
"podKategorie": [
{
"podKategoriaTyp": "somethingelse",
"nazwaWyswietlana": "Display something else",
"podKategoria": {
"podKategoriaTyp": "and other thing",
"nazwaWyswietlana": "Display and other thing",
"podKategorie": [
{
"podKategoriaTyp": "sub nd other thing",
"nazwaWyswietlana": "display nd other thing"
},
{
"podKategoriaTyp": "sub 2 nd other thing",
"nazwaWyswietlana": "display sub 2 nd other thing"
},
{
"podKategoriaTyp": "sub 3 nd other thing",
"nazwaWyswietlana": "display sub 3 nd other thing"
}
]
}
},
{
"podKategoriaTyp": "another one",
"nazwaWyswietlana": "display another one",
"podKategoria": {
"podKategoriaTyp": "and and another one ",
"nazwaWyswietlana": "display it another one",
"podKategorie": [
{
"podKategoriaTyp": "sub 1 another one",
"nazwaWyswietlana": "display sub 1"
},
{
"podKategoriaTyp": "sub 2 another one",
"nazwaWyswietlana": "display sub 2"
},
]
}
},
]
}
}
在此之后我使用https://mholt.github.io/json-to-go/尝试为我创建结构。最合适的方法似乎是创建基本结构,如
type Struktury struct {
PodKategorie PodKategoria `json:"podKategoria"`
}
type PodKategoria struct {
PodKategoriaTyp string `json:"podKategoriaTyp"`
NazwaWyswietlana string `json:"nazwaWyswietlana"`
PodKategorie []struct {
SubCategoryType string `json:"podKategoriaTyp"`
DisplayName string `json:"nazwaWyswietlana"`
} `json:"podKategorie, omitempty"`
}
但是你可以看到JSON结构有点棘手,而且我有点想要找到正确的解决这个JSON字符串的最佳方法:/
初次尝试使用默认值允许我获取项目的根(在操场https://play.golang.org/p/uQMnMGEtXD-中测试)因此这让我想到可能是自定义unmarshall接口实现的方法吗?任何指针如何解决这个问题将不胜感激
答案 0 :(得分:2)
这是一个有效的解决方案,请检查playground
type Categories []*Category
type Category struct {
Type string `json:"podKategoriaTyp"`
Display string `json:"nazwaWyswietlana"`
Categories Categories `json:"podKategorie"`
SubCategory *Category `json:"podKategoria"`
}
func main() {
cat := &Category{}
err := json.Unmarshal([]byte(JSON), &cat)
if err != nil {
log.Fatal(err)
}
buf, err := json.Marshal(cat)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s\n", buf)
}