我有这样的JSON:
{
"store_name": "Barry's Farmer's Market",
"foods": {
"apple": "5.91",
"peach": "1.84",
"carrot": "6.44",
"beans": "3.05",
"orange": "5.75",
"cucumber": "6.42"
},
"store_location": "Corner of Elm Tree Hill and 158th Street"
}
我想使用map[string]interface{}
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)
func main() {
var parsed map[string]interface{}
f, err := ioutil.ReadFile("input.txt")
if err != nil {
fmt.Printf("Error: %v", err)
os.Exit(1)
}
err = json.Unmarshal(f, &parsed)
for k, v := range parsed {
//fmt.Println(parsed["foods"])
fmt.Println(k + string(v))
}
}
考虑到“v”没有转换为字符串而我想要对“食物”中的所有值进行调整,你能帮助我吗?我想我错过了什么......
答案 0 :(得分:4)
如果您阅读the documentation for json.Unmarshal
,您可以看到它将使用哪种类型,并将代码基于此;或者使用fmt.Printf("%T",v)
查看它在运行时的类型。
err = json.Unmarshal(f, &parsed)
for k, v := range parsed["foods"].(map[string]interface{}) {
fmt.Println(k, v)
}
答案 1 :(得分:1)
你可以创建一个包含map[string]string
的结构并迭代它。 https://play.golang.org/p/IVlrTTcrVB
type Store struct {
Name string `json:"store_name"`
Foods map[string]string `json:"foods"`
Location string `json:"store_location"`
}
func main() {
var store Store
data := []byte(jsonData)
err := json.Unmarshal(data, &store)
if err != nil {
panic(err)
}
for k, v := range store.Foods {
fmt.Println(k + string(v))
}
}
答案 2 :(得分:0)
fastjson可用于解析未知的JSON并迭代到它中:
var p fastjson.Parser
v, err := p.Parse(input)
if err != nil {
log.Fatal(err)
}
// Visit will call the callback for each item in v.foods.
v.GetObject("foods").Visit(func(foodName []byte, foodValue *fastjson.Value) {
fmt.Printf("%s = %s\n", foodName, foodValue)
})