ホームページ > バックエンド開発 > Golang > golangでjson形式を解析する方法

golangでjson形式を解析する方法

藏色散人
リリース: 2021-01-25 14:43:21
転載
2938 人が閲覧しました

次のコラム 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 フィールドを取り出し、それを表示用の結果文字列に変換する必要があります

  • json 配列から ws を取得します。
  • ws は配列、配列要素は object
  • cw は配列、配列要素は object
  • w は string
  • Traverse from cw to get the w field

暫定的な実装は次のとおりです:

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート