Строка json, если вы хотите получить в ней данные, вам нужно ее разобрать
1. Применимо к случаю, когда известна структура данных json
Используйте json.Unmarshal для анализа данных json в структуру
Согласно определению формата строковых данных json
struct
, он используется для сохранения декодированного значения. Здесь мы сначала определяем структуру, которая совпадает со структурой данных для анализа, а затемjson.Unmarshal
декодируем ее.Если данные json сложные, пользовательская структура будет сложной.
package main
import (
"encoding/json"
"fmt"
)
var jsonstr = `{"province":{"value":"110000",
"label":"北京市"},
"city":{"value":"110100",
"label":"北京城区"},
"district":{"value":"110115",
"label":"大兴区"}
}`
type JsonData struct {
Province JsonData2 `json:"province"`
City JsonData2 `json:"city"`
District JsonData2 `json:"district"`
}
type JsonData2 struct {
Value string `json:"value"`
Label string `json:"label"`
}
// json解码
func JsonDecode() {
//json解码
jsondata := JsonData{}
_ = json.Unmarshal([]byte(jsonstr), &jsondata)
fmt.Println(jsondata.Province.Label)
fmt.Println(jsondata.City.Label)
fmt.Println(jsondata.District.Label)
}
2. Применимо к случаю, когда структура данных json неизвестна
1. Используйте карты
package main
import (
"encoding/json"
"fmt"
)
var jsonStr = `{
"name": "A",
"sex": "男",
"address": [
{ "province": "河南省", "city": "郑州市", "district": "金水区", "detail": "XX街道" },
{ "province": "河南省", "city": "安阳市", "district": "北关区", "detail": "YY街道" }
]
}
`
func main() {
var user map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &user)
if err != nil {
panic("解析失败")
}
fmt.Printf("名字:%s\n", user["name"].(string))
fmt.Printf("性别:%s\n", user["sex"].(string))
for i, address := range user["address"].([]interface{}) {
addr := address.(map[string]interface{})
fmt.Printf("地址%d:%s,%s,%s %s\n", i, addr["province"].(string), addr["city"].(string), addr["district"].(string), addr["detail"].(string))
}
}
2. Используйте трехсторонний пакет
1, github.com/bitly/go-simplejson
package main
import (
"fmt"
"github.com/bitly/go-simplejson"
)
var jsonStr := `{
"name": "A",
"sex": "男",
"address": [
{ "province": "河南省", "city": "郑州市", "district": "金水区", "detail": "XX街道" },
{ "province": "河南省", "city": "安阳市", "district": "北关区", "detail": "YY街道" }
]
}`
func main() {
// github.com/bitly/go-simplejson
jst, err := simplejson.NewJson(jsonStr)
if err != nil {
panic("解析失败")
}
name, _ := jst.Get("name").String()
sex, _ := jst.Get("sex").String()
fmt.Printf("名字:%s\n", name)
fmt.Printf("性别:%s\n", sex)
for i, v := range jst.Get("address").MustArray() {
ads := v // v等同于jst.Get("address").GetIndex(i)
province, _ := ads.Get("province").String()
city, _ := ads.Get("city").String()
district, _ := ads.Get("district").String()
detail, _ := ads.Get("detail").String()
fmt.Printf("地址%d:%s,%s,%s %s\n", i, province, city, district, detail)
}
}
2, github.com/spf13/viper
1. Необходимо
viper.SetConfigType("json")函数
указать формат данных для парсинга, иначе даже еслиviper.ReadConfig
не будет сообщено об ошибке, результат парсинга не будет возвращен2. Методы
viper.Get(),viper.GetString(),viper.GetBool()
и т. д. могут легко получить значение ключа, и в то же время они также могут очень хорошо определить тип значения ключа.
package main
import (
"fmt"
"strings"
"github.com/spf13/viper"
)
var jsonstr= `{
"name": "tian",
"flag": false,
"address": {
"city": "北京",
"area": "中国"
}
}`
func main() {
// 设置需要配置的数据类型为json
viper.SetConfigType("json")
// 读取数据到viper
if err := viper.ReadConfig(strings.NewReader(jsonstr)); err != nil {
fmt.Println(err)
}
fmt.Printf("数据的所有键值: %v\n", viper.AllKeys())
fmt.Printf("解析后的数据:%v\n", viper.AllSettings())
fmt.Printf("The name is %s and the area is %s\n", viper.Get("name"), viper.Get("address.area"))
}
3、github.com/thedevsaddam/gojsonq
После использования Find для запроса имени Reset()
метод вызывается один раз. Потому что gojsonqFind
будет записывать текущую точку внутри при вызове метода, и следующий запрос начнется с последней записанной точки
package main
import (
"fmt"
"github.com/thedevsaddam/gojsonq/v2"
)
var jsonstr = `{
"name": "sam",
"flag": true,
"address": {
"city": "北京",
"area": "中国"
}
}`
func main() {
jst:= gojsonq.New().FromString(jsonstr)
namestr := jst.Find("name").(string)
jst.Reset()
citystr := jst.Find("address.city")
fmt.Printf("The name is %s and the city is %v", namestr, citystr)
}