どのように[シリーズ] GoがJSONデータを解析しましたか?

アウトライン

最近の需要がちょうどスケジュールに深刻な問題を評価するために登る、ピットに落ち、次の3つの図は、気分を実勢に沿ったものです。

オンデマンドで

見積スケジュール

乾燥し始めました

なぜこのように、私の簡潔は以下に要約されています。

  • 第三者とドッキング。
  • クロスドッキングチーム。
  • ゴーでプロジェクトを行うには初めて。
  • ビジネスプロセスは、スケジュール(ピット)に明確に記録しませんでした。
  • 調整後の需要はないスケジュール(ピット)を調整します。

この経験では、スケジュールを評価するとあなたも起こっていることができる方法で、後者。

騒ぎ、テーマ今日に。

今日JSONデータ移動を解析する方法を共有し、その上で不確実な構造体を返すと、3例、強く型付けされた解像度、弱いタイプの解像度が含まれています。

JSON構造

たとえば、インターフェイスを要求された自宅の電話、JSONは、次のデータを返します。

{
    "resultcode": "200",
    "reason": "Return Successd!",
    "result": {
        "province": "浙江",
        "city": "杭州",
        "areacode": "0571",
        "zip": "310000",
        "company": "中国移动",
        "card": ""
    }
}

アイデアはこれです:

構造体への1.まずJSONターン。

2.次に、json.Unmarshal()次のことができます。

JSONターン構造体、自分の手書きあまりにも面倒、私はこれを使用して、多くのオンラインツールを直接使用することができますがあります。

https://mholt.github.io/json-to-go/

左後JSONに固定構造体を生成します。

達成するためにコードを使用します:

type MobileInfo struct {
    Resultcode string `json:"resultcode"`
    Reason     string `json:"reason"`
    Result     struct {
        Province string `json:"province"`
        City     string `json:"city"`
        Areacode string `json:"areacode"`
        Zip      string `json:"zip"`
        Company  string `json:"company"`
        Card     string `json:"card"`
    } `json:"result"`
}

func main() {
    jsonStr := `
        {
            "resultcode": "200",
            "reason": "Return Successd!",
            "result": {
                "province": "浙江",
                "city": "杭州",
                "areacode": "0571",
                "zip": "310000",
                "company": "中国移动",
                "card": ""
            }
        }
    `

    var mobile MobileInfo
    err := json.Unmarshal([]byte(jsonStr), &mobile)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Println(mobile.Resultcode)
    fmt.Println(mobile.Reason)
    fmt.Println(mobile.Result.City)
}

出力:

200
Return Successd!
杭州

パーフェクト解像度。

この問題は終わっていないために、これらの質問を熟考します:

JSON形式のデータ・タイプが不明ではどのように行いますか?

データ結果JSON形式のパラメータが固定されていない場合はどのように行うには?

アイデアはこれです:

オープンソースライブラリがgithubの上で見つけるために、ハハ、私が使用していますが、これは次のとおりです。

https://github.com/mitchellh/mapstructure

のは、最初の問題、どのように行うために、データ・タイプが不明を解決する最初の下で一緒に学びましょうか!

ResultCodeの、JSONの文字列タイプではなく、返されたint型のResultCodeのを定義します。

弱いのドキュメントタイプの解像度を確認する方法がありWeakDecode()、レッツ・トライは:

type MobileInfo struct {
    Resultcode string `json:"resultcode"`
}

func main() {
    jsonStr := `
        {
            "resultcode": 200
        }
    `

    var result map[string]interface{}
    err := json.Unmarshal([]byte(jsonStr), &result)
    if err != nil {
        fmt.Println(err.Error())
    }

    var mobile MobileInfo
    err = mapstructure.WeakDecode(result, &mobile)
    if err != nil {
        fmt.Println(err.Error())
    }

    fmt.Println(mobile.Resultcode)
}

出力:

200

最初の問題は解決されました。

そして、第二の問題を解決するため、どのようにして固定されていないパラメータにつながりますか?

これは上記の例で、公式の表情によって提供された例がありませんExample (EmbeddedStruct)

type Family struct {
    LastName string
}
type Location struct {
    City string
}
type Person struct {
    Family    `mapstructure:",squash"`
    Location  `mapstructure:",squash"`
    FirstName string
}

func main() {
    input := map[string]interface{}{
        "FirstName": "Mitchell",
        "LastName":  "Hashimoto",
        "City":      "San Francisco",
    }

    var result Person
    err := mapstructure.Decode(input, &result)
    if err != nil {
        panic(err)
    }

    fmt.Println(result.FirstName)
    fmt.Println(result.LastName)
    fmt.Println(result.City)
}

出力:

Mitchell
Hashimoto
San Francisco

mapstructureパッケージを使用して、構造体タグの識別はない書き込みJSON、書き込みmapstructureを行います。

他の例は、次のような、自分の権利を探求しますExample (Tags)

ゴーGIN-APIシリーズ

184元記事公開 ウォンの賞賛141 ビューに35万+を

おすすめ

転載: blog.csdn.net/sinat_27535209/article/details/103834769