ホームページ > バックエンド開発 > Golang > 変数タイプ (文字列または文字列の配列) を使用して JSON データをアンマーシャリングする方法

変数タイプ (文字列または文字列の配列) を使用して JSON データをアンマーシャリングする方法

Linda Hamilton
リリース: 2024-10-29 02:58:02
オリジナル
484 人が閲覧しました

How to Unmarshal JSON Data with Variable Types: String or Array of Strings?

バリアント構造を使用した JSON のデコード

使用しているエンドポイントは、JSON をさまざまな形式 (文字列として、または文字列として返す場合があります) で返します。配列。この矛盾に対処するために、次の質問では、両方のタイプに対応できる Go 構造体を設計するための最良のアプローチを検討します。

質問:

Go を作成するにはどうすればよいですか?変数型 (文字列または文字列の配列) を使用して JSON データをアンマーシャリングできる構造体? 2 つの別々の構造体にデコードする以外に洗練された解決策はありますか?

答え:

より洗練されたアプローチには、JSON をインターフェース タイプにアンマーシャリングすることが含まれます。{}この型に依存しないアプローチにより、さまざまな値の型を動的に処理できます。

この手法を実装するには、次の例に示すように、interface{} 型のフィールドを持つ構造体を作成します。

<code class="go">type Response struct {
    Message interface{} `json:"message"`
}</code>
ログイン後にコピー

JSON データをこの構造体にアンマーシャリングする場合、型スイッチまたは型アサーションを使用して、Message フィールドの実際の型を決定できます。これにより、それに応じてデータを処理できます。

実装例は次のとおりです。

<code class="go">func main() {
    inputs := []string{
        `{"message":"Message"}`,
        `{"message":["ERROR_CODE"]}`,
    }

    for _, input := range inputs {
        var r Response
        if err := json.Unmarshal([]byte(input), &r); err != nil {
            panic(err)
        }
        switch x := r.Message.(type) {
        case string:
            fmt.Println("Success, message:", x)
        case []interface{}:
            fmt.Println("Error, code:", x)
        default:
            fmt.Println("Something else:", x)
        }
    }
}</code>
ログイン後にコピー

出力:

Success, message: Message
Error, code: [ERROR_CODE]
ログイン後にコピー

インターフェース{} アプローチを利用すると、次のことが得られます。さまざまなタイプの JSON データを柔軟に処理できるため、コードベースが簡素化されます。

以上が変数タイプ (文字列または文字列の配列) を使用して JSON データをアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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