一个json字串,想要拿到其中的数据,就需要解析出来
一、适用于json数据的结构已知的情况下
使用json.Unmarshal将json数据解析到结构体中
根据json字串数据的格式定义
struct
,用来保存解码后的值。这里首先定义了一个与要解析的数据结构一样的结构体,然后通过json.Unmarshal
进行解码,如果json数据很复杂,自定义的struct就跟着复杂。
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)
}
二、适用于json数据的结构未知的情况下
1、使用map
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()
等等可以方便获取键值,同时对于键值的类型也能很好的判断文章来源:https://www.toymoban.com/news/detail-626943.html
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查询name之后,调用了一次Reset()
方法。因为gojsonq在调用Find
方法时,内部会记录当前的点,下一个查询会从上次记录的点开始文章来源地址https://www.toymoban.com/news/detail-626943.html
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)
}
到了这里,关于GO中Json的解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!