ホームページ >バックエンド開発 >Golang >Go で変数 JSON 構造を効率的に処理するにはどうすればよいですか?

Go で変数 JSON 構造を効率的に処理するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-22 03:26:57513ブラウズ

How to Efficiently Handle Variable JSON Structures in Go?

Go で変数構造を使用した JSON データをデコードする

サードパーティ ソースからの JSON データを操作する場合、次のようなシナリオに遭遇することは珍しくありません。データの構造は異なる場合があります。これは、構造体を使用して JSON を特定のデータ型にアンマーシャリングする Go プログラムにとって課題となります。

JSON 応答に、「gwrcmd」などの特定のプロパティ内の単一の要素または配列が含まれる場合を考えてみましょう。この例では。 「gwrcmd」が常に単一の要素である場合は、次のような構造体が適しています:

type Response struct {
    Gwrcmds struct {
        Gwrcmd struct {
            Gcmd  string
            Gdata struct {
                Gip struct {
                    Version string
                }
            }
        }
    }
}

ただし、「gwrcmd」が配列である場合がある場合、アンマーシャリング中にエラーが発生します。

柔軟性を高めるための json.RawMessage の使用

A可変構造の JSON データを処理する一般的なアプローチは json.RawMessage を使用することです。これにより、特定の型を指定せずに任意の JSON 値をキャプチャできます。生の値を取得したら、それを調べて、さらにアンマーシャリングする方法を決定できます。

type Response struct {
    Gwrcmds struct {
        Gwrcmd json.RawMessage
    }
}

Response 構造体の UnmarshalJSON メソッドでは、Gwrcmd の内容を検査し、適切な値にアンマーシャリングできます。 type:

func (r *Response) UnmarshalJSON(b []byte) error {
    if err := json.Unmarshal(b, &r.Gwrcmds); err != nil {
        return err
    }
    if r.Gwrcmds.Gwrcmd[0] == '[' {
        return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsArray)
    }
    return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsSingle)
}

この場合、配列と単一要素のシナリオの両方を、別々のフィールドを作成して処理します。

代替アプローチ

json.RawMessage は柔軟性を提供しますが、データ構造の手動処理が必要であり、あらゆる場合に適しています。代替アプローチには次のものがあります。

  • インターフェイスの使用: 配列と単一要素の場合の共通の動作をカプセル化するインターフェイスを定義し、構造体定義でインターフェイスの型を使用します。
  • 個別の構造体の作成: 問題で示唆されているように、配列シナリオと単一要素シナリオで構造体を分け、UnmarshalJSON メソッドで型アサーションを使用して、どの構造体を使用するかを決定します。

最適なアプローチは、アプリケーションの特定の要件とその複雑さによって異なります。 JSON データ。

以上がGo で変数 JSON 構造を効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。