我想決議這個JSON :
{
"error": null,
"id": "tutu",
"result": {
"param1": 559,
"param2": "yo",
"param3"/span>: {"tab"/span>: ["a", "b"], "param4":"Hello"}。
}
}
問題是,如果JSON結構發生變化,我想要一個靈活的解決方案。我希望能夠用一個密鑰系統來訪問每個欄位(就像在Javascript中),而不需要事先知道JSON結構:
fmt. Println(jsonObj["result"]["param3"]["tab"] [1]
是否可以這樣做呢?
uj5u.com熱心網友回復:
是的,這是有可能的,盡管你需要斷言型別的事實使得它有點不方便:
package main
import (
"encoding/json"/span>
"fft"
)
func main() {
b :=[]byte(`)
{
"錯誤": null,
"id": "tutu",
"結果"。{
"param1": 559,
"param2": "yo",
"param3": {"tab":["a", "b"], "param4": "hello"}
}
}
`)
var jsonObj interface{}。
err := json.Unmarshal(b, &jsonObj)
if err != nil {
panic(err)
}
msg := jsonObj.(map[string]interface{})
result := msg["result"]. (map[string]interface{})
param3 := result["param3"]. (map[string]interface{})
tab := param3["tab"]。([]interface{})
fmt.Println(tab[1] )
}
這樣就可以列印了
b
就像你所期望的那樣。
注意,這個程式會恐慌:不僅僅是在JSON無法決議的情況下,而且是在JSON與程式的預期不完全匹配的情況下:缺少鍵、不同型別等等。
The Go Blog 上的帶介面的通用 JSON部分,有一個在運行時檢查事物實際型別的例子;正如評論中所建議的,這很容易被遺忘。
JSON 和 Go文章。
uj5u.com熱心網友回復:
首先,在你的例子中,unmarshall直接進入map[string]interface{}來保存一個斷言。
var jsonObj map[string]interface{}。
err := json.Unmarshal(b, &jsonObj)
其次,記得要檢查斷言
result, ok := jsonObj["result"] 。 (map[string]interface{})
if !ok {
panic("not json obj"/span>)
}
param3, ok := result["param3"]. (map[string]interface{})
if !ok {
panic("not json obj"/span>)
}
tab, ok := param3["tab"]。([]interface{})
if !ok {
panic("not json arr"/span>)
}
最后,你可以宣告一個新的型別并在其方法中 "隱藏 "斷言
type AnyObj map[string]interface{}。
func (obj AnyObj) MustObject(name string) AnyObj{
v, ok := obj[name]. (map[string]interface{})
if !ok {
panic("not json obj"/span>)
}
return AnyObj(v)
}
func (obj AnyObj) MustArray (obj AnyObj) title">MustArray(name string) []interface{} {
v, ok := obj[name]. ([]interface{})
if !ok {
panic("not json arr"/span>)
}
return v
}
然后像這樣使用:
func main() {
var jsonObj AnyObj
err := json.Unmarshal(b, &jsonObj)
if (err != nil) {
panic(err)。
}
tab := jsonObj.MustObject("result").MustObject("param3") .MustArray("tab")
fmt.Println(tab[1] )
}
在這里檢查 https://play.golang.org/p/ucdMZ0VEKcr
uj5u.com熱心網友回復:
這是我使用的fastjson:
package main
import (
"fmt"/span>
"github.com/valyala/fastjson"/span>
)
型別 ParseValue 結構 {
*fastjson.Value
}
func Parse(b []byte) (*ParseValue。錯誤) {
var p fastjson.Parser
v, err := p.ParseBytes(b)
if err != nil {
return nil, err
}
return &ParseValue{v}, nil.
}
func (p *ParseValue) GetString(keys . ...string) string {
return string(p.GetStringBytes(keys...) )
}
func main {
b :=[]byte(`)
{
"錯誤": null,
"id": "tutu",
"結果"。{
"param1": 559,
"param2": "yo",
"param3": {"tab":["a", "b"], "param4": "hello"}
}
}
`)
v, err := Parse(b)
if err != nil {
panic(err)
}
r := v.GetString("result"/span>, "param3"/span>, "tab"/span>, "1"/span>)
fmt.Println(r)
rr := v.GetUint("result", "param1")
fmt.Println(rr)
// output:
// b
//559。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/314854.html
標籤:
下一篇:在找到一個模式后迭代以前的行
