次のコラム golang チュートリアル では、golang が json 形式を解析する方法を紹介します。困っている友人の役に立てば幸いです。
プロジェクト内のクライアントとサーバー間の対話データ部分は json であるため、サーバー側で解析する必要がありますが、複雑な json を解析するのは実際には非常に手間がかかります。
対話型データは次の形式に似ています:
{"sn":1,"ls":false,"bg":0,"ed":0,"ws":[{"bg":0,"cw":[{"sc":0,"w":"还"}]},{"bg":0,"cw":[{"sc":0,"w":"有点"}]},{"bg":0,"cw":[{"sc":0,"w":"眼熟"}]}]}
json 形式の w フィールドを取り出し、それを表示用の結果文字列に変換する必要があります
暫定的な実装は次のとおりです:
func RecResultJsonToPlain() { var recResult string var dat map[string]interface{} json.Unmarshal([]byte(json_str), &dat) if v, ok := dat["ws"]; ok { ws := v.([]interface{}) for i, wsItem := range ws { wsMap := wsItem.(map[string]interface{}) if vCw, ok := wsMap["cw"]; ok { cw := vCw.([]interface{}) for i, cwItem := range cw { cwItemMap := cwItem.(map[string]interface{}) if w, ok := cwItemMap["w"]; ok { recResult = recResult + w.(string) } } } } } fmt.Println(recResult) }
このように、レイヤーごとに型を変換し、次に要素を取得します。これは既知の json データ構造であるため、構造を定義して解析できます。
type CWItem struct { SC int32 `json:"sc"` W string `json:"w"`}type WSItem struct { CW []CWItem}type IatResult struct { SN int32 `json:"sn"` LS bool `json:"ls"` BG int32 `json:"bg"` ED int32 `json:"ed"` WS []WSItem `json:"ws"`}
Note変数を定義するときは、変数名の最初の文字を大文字にする必要があります。ツールを使用して定義を自動的に生成することもできます https://mholt.github.io/ json-to -go/; 生成されたツールは非常に美しいです:
type AutoGenerated struct { Sn int `json:"sn"` Ls bool `json:"ls"` Bg int `json:"bg"` Ed int `json:"ed"` Ws []struct { Bg int `json:"bg"` Cw []struct { Sc int `json:"sc"` W string `json:"w"` } `json:"cw"` } `json:"ws"` }
func RecResultJsonToPlain(jsonResult []byte)(recPlainResult string) { var r IatResult json.Unmarshal(jsonResult, &r) for _, wsItem := range r.WS { for _, cwItem := range wsItem.CW { recPlainResult = recPlainResult + cwItem.W } } return recPlainResult }
上記の要素には json:"sn"
必須の説明があるため、対応する要素、その他の要素 定義しなくても大丈夫です。別の種類のデータは、配列内の要素が依然として配列であり、最後の配列には数値または文字列型が含まれています。関数を書き直す必要があります。データは次のとおりです。[21,1]
{"Asks": [[21, 1], [22, 1]] ,"Bids": [[20, 1], [19, 1]]}
次のようにコードを検索し、UnmarshalJSON を再実装します
package mainimport ( "encoding/json" "fmt")type Message struct { Asks []Order `json:"Bids"` Bids []Order `json:"Asks"`}type Order struct { Price float64 Volume float64}func (o *Order) UnmarshalJSON(data []byte) error { var v [2]float64 if err := json.Unmarshal(data, &v); err != nil { return err } o.Price = v[0] o.Volume = v[1] return nil}func main() { b := []byte(`{"Asks": [[21, 1], [22, 1]] ,"Bids": [[20, 1], [19, 1]]}`) var m Message if err := json.Unmarshal(b, &m); err != nil { fmt.Println(err) return } fmt.Printf("%#v\n", m)}
Golang 関連の技術記事の詳細については、go language 列をご覧ください。
以上がgolangでjson形式を解析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。