ホームページ >バックエンド開発 >Golang >ダブルアンマーシャリングなしでGoでJSONを解析するにはどうすればよいですか?

ダブルアンマーシャリングなしでGoでJSONを解析するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-26 15:58:141010ブラウズ

How to Parse JSON in Go Without Double Unmarshaling?

Go でダブルアンマーシャリングを行わずに JSON を解析する

Go では、二重アンマーシャリングを行わずにさまざまな型の JSON データを解析したい状況に遭遇することがあります。アンマーシャリングを 2 回実行します。関連する手順を見てみましょう:

ステップ 1: 汎用マップにアンマーシャリングする

前述したように、最初のステップは、JSON を汎用マップにアンマーシャリングすることです。 ]インタフェース{}。これにより、キーが文字列、値がさまざまなデータ構造を保持できる動的インターフェース タイプであるマップのような構造が提供されます。

ステップ 2: キーと値のタイプを特定する

マップを取得したら、それを繰り返し処理して、目的のキーを見つけます。値のタイプに応じて、次のステップに進むことができます。

ステップ 3: 既知の型を直接処理する

値の型が既知の構造体の場合は、それを直接キャストして、目的の構造体として使用できます。たとえば、Ping 構造体がある場合、マップ値が Ping にキャスト可能かどうかを確認できます。これは、JSON フィールド名が構造体フィールド名と一致し、データ型に互換性がある場合にうまく機能します。

ステップ 4: 不明な型に対する代替アプローチ

値の型が不明であるか、事前定義された構造体と互換性がない場合は、次の方法を使用できます。アプローチ:

  1. json.Marshal を使用してインターフェースからの値を JSON にマーシャルします。
  2. json.Unmarshal を使用して JSON を目的の構造体にアンマーシャルします。

部分的に改善アンマーシャリング

二重アンマーシャリングの必要性を回避するには、interface{} の代わりに値を json.RawMessage にアンマーシャリングすることで、データを部分的にアンマーシャリングできます。 json.RawMessage は生の JSON 値を表し、後で目的の構造体に直接アンマーシャリングできます。

コードの例

提供された例では、次のようなコード:

var myMap map[string]json.RawMessage

...

switch k {
    case "ping":
        // ...
    case "ack":
        err = json.Unmarshal(v, &myAck)
}

このアプローチでは、値の型が知られています。ただし、さまざまなケースを処理するには、switch ステートメントを記述する必要があります。

以上がダブルアンマーシャリングなしでGoでJSONを解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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