网站备案各种问题汇总,产品营销软文,建行购物网站,中国建设银行车主卡网站一个json字串#xff0c;想要拿到其中的数据#xff0c;就需要解析出来
一、适用于json数据的结构已知的情况下
使用json.Unmarshal将json数据解析到结构体中 根据json字串数据的格式定义struct#xff0c;用来保存解码后的值。这里首先定义了一个与要解析的数据结构一样的…一个json字串想要拿到其中的数据就需要解析出来
一、适用于json数据的结构已知的情况下
使用json.Unmarshal将json数据解析到结构体中 根据json字串数据的格式定义struct用来保存解码后的值。这里首先定义了一个与要解析的数据结构一样的结构体然后通过json.Unmarshal进行解码如果json数据很复杂自定义的struct就跟着复杂。 package mainimport (encoding/jsonfmt
)var jsonstr {province:{value:110000,label:北京市},city:{value:110100,label:北京城区},district:{value:110115,label:大兴区}}type JsonData struct {Province JsonData2 json:provinceCity JsonData2 json:cityDistrict JsonData2 json:district
}type JsonData2 struct {Value string json:valueLabel 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 mainimport (encoding/jsonfmt
)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 mainimport (fmtgithub.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-simplejsonjst, 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 mainimport (fmtstringsgithub.com/spf13/viper
)var jsonstr {name: tian,married: false,address: {city: beijing,country: China}}
func main() {// 指定配置的类型为jsonviper.SetConfigType(json)// 读取数据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 country is %s\n, viper.Get(name), viper.Get(address.country))
}3、github.com/thedevsaddam/gojsonq
查询name之后调用了一次Reset()方法。因为jsonq在调用Find方法时内部会记录当前的点下一个查询会从上次记录的点开始
package mainimport (fmtgithub.com/thedevsaddam/gojsonq/v2
)var jsonstr {name: sam,sex: false,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)
}