英文:
Decoding a slice of maps from a JSON string in Golang
问题
根据你提供的代码,你想要解析一个包含复杂数据结构的 JSON 字符串。具体来说,你想要解析一个包含键为 "activities",值为一个包含多个映射的切片的 JSON 对象。
为了正确解析这个 JSON 字符串,你需要对 Response
结构体进行一些修改。你可以将 Activities
字段的类型设置为 []map[string]string
,表示它是一个包含多个映射的切片。每个映射都有一个键 "name" 和对应的值。
以下是修改后的代码示例:
package main
import (
"encoding/json"
"fmt"
)
type Response struct {
Page int `json:"page"`
Fruits []string `json:"fruits"`
Activities []map[string]string `json:"activities"`
}
func main() {
str := `{"page": 1, "fruits": ["apple", "peach"], "activities": [{"name": "running"}, {"name": "swimming"}]}`
res := Response{}
json.Unmarshal([]byte(str), &res)
fmt.Println(res.Page)
fmt.Println(res.Fruits)
fmt.Println(res.Activities)
}
这样修改后,你应该能够正确解析 activities
字段中的数据了。希望对你有帮助!
英文:
Following the Go by Example: JSON tutorial, I see how to work with a basic JSON string:
package main
import (
"encoding/json"
"fmt"
)
type Response struct {
Page int `json:"page"`
Fruits []string `json:"fruits"`
}
func main() {
str := `{"page": 1, "fruits": ["apple", "peach"]}`
res := Response{}
json.Unmarshal([]byte(str), &res)
fmt.Println(res.Page)
fmt.Println(res.Fruits)
}
// the output looks good here:
// 1
// [apple peach]
I would like to add some complexity to the str
data object that I am decoding.
Namely, I would like to add a key with a slice of maps as its value:
"activities": [{"name": "running"}, {"name", "swimming"}]
My script now looks like below example, however, for the life of me, I can not figure out what the correct syntax is in the Response
struct in order to get at the values in activities
. I know that this syntax isn't correct: Activities []string ...
but can not hack my way towards a solution that captures the data I want to display.
package main
import (
"encoding/json"
"fmt"
)
type Response struct {
Page int `json:"page"`
Fruits []string `json:"fruits"`
Activities []string `json:"activities"`
}
func main() {
str := `{"page": 1, "fruits": ["apple", "peach"], "activities": [{"name": "running"}, {"name", "swimming"}]}`
res := Response{}
json.Unmarshal([]byte(str), &res)
fmt.Println(res.Page)
fmt.Println(res.Fruits)
fmt.Println(res.Activities)
}
// the script basically craps out here and returns:
// 0
// []
// []
Thanks for any help!
答案1
得分: 4
使用[]map[string]string:
type Response struct {
Page int `json:"page"`
Fruits []string `json:"fruits"`
Activities []map[string]string `json:"activities"`
}
始终检查和处理错误。示例JSON中有一个语法错误,在playground示例中已经进行了修正。
英文:
Use []map[string]string:
type Response struct {
Page int `json:"page"`
Fruits []string `json:"fruits"`
Activities []map[string]string `json:"activities"`
}
<kbd>playground example</kbd>
Always check and handle errors.
The example JSON has a syntax error which is corrected in the playground example.
答案2
得分: 0
我知道这是一个旧的问题,但最近我编写了一个用于从JSON输入生成精确Go类型的实用程序,在类似的情况下,你可以试试这个:https://github.com/m-zajac/json2go
对于这个特定的示例,它从JSON生成了以下Go类型:
type Object struct {
Activities []struct {
Name string `json:"name"`
} `json:"activities"`
Fruits []string `json:"fruits"`
Page int `json:"page"`
}
希望对你有帮助!
英文:
I know this is an old one, but i've recently written utility for generating exact go type from json input and in similar case you could give it a spin: https://github.com/m-zajac/json2go
For this particular example it generates from json:
{"page": 1, "fruits": ["apple", "peach"], "activities": [{"name": "running"}, {"name": "swimming"}]}
go type:
type Object struct {
Activities []struct {
Name string `json:"name"`
} `json:"activities"`
Fruits []string `json:"fruits"`
Page int `json:"page"`
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论