ホームページ >バックエンド開発 >Golang >構造を知らずにネストされた JSON データをアンマーシャリングするにはどうすればよいですか?

構造を知らずにネストされた JSON データをアンマーシャリングするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-02 16:55:03470ブラウズ

How can I unmarshal nested JSON data without knowing its structure?

構造が不明なネストされた JSON のアンマーシャリング

構造が定義されていないネストされた JSON データに遭遇した場合、アンマーシャリングの課題を軽減するためのアプローチがいくつかあります。

アンマーシャルの繰り返しを避ける

アンマーシャル操作を最小限に抑えることは、一般的に推奨されます。将来の使用に備えてアンマーシャリングされたオブジェクトを保存し、繰り返しのアンマーシャリングを避けるために、キャッシュ メカニズムを実装することを検討してください。ただし、場合によっては、特にさまざまな型のネストされた構造を扱う場合、複数のアンマーシャリングが必要になることがあります。

アンマーシャリングのための正しい構造の決定

メソッド1: マップ[文字列]インターフェースへのアンマーシャル{}

json.RawMessage をマップ[文字列]インターフェース{}へアンマーシャルします。これにより、ネストされた構造を調べて型を特定し、その後アンマーシャリングする正しい構造体を特定できるようになります。

例:

<code class="go">var objMap map[string]interface{}
json.Unmarshal(rawMessage, &objMap)</code>

方法 2 : 正規表現一致

正規表現を使用して、JSON データ内の型文字列と一致します。型がわかったら、リフレクションまたは型スイッチを使用して、対応する構造体にアンマーシャリングします。

例:

<code class="go">type Regex *regexp.Regexp

// Split the JSON data into key-value pairs
type KeyValue struct {
    Key   string
    Value string
}

// Regex for extracting the type
var typeRE = Regex(regexp.MustCompile(`(?m)^.*"type": "(.+)".*$`))

// Unmarshal the raw message and extract the type
func getType(rawMessage []byte) (string, error) {
    var data KeyValue
    err := json.Unmarshal(rawMessage, &data)
    if err != nil {
        return "", err
    }
    matches := typeRE.FindStringSubmatch(data.Value)
    return matches[1], nil
}</code>

コピーまたは通常の使用式のアプローチ

方法 A: コピーとアンマーシャル

  1. json.RawMessage のコピーを作成します。
  2. コピーをアンマーシャルします
  3. 元の json.RawMessage を、決定された型の構造体にアンマーシャルします。

方法 B: 正規表現とアンマーシャル

  1. 正規表現を使用して型を決定します。
  2. リフレクションまたは型スイッチを使用して、決定された型で構造体の新しいインスタンスを作成します。
  3. json.RawMessage を新しく作成された構造体にアンマーシャリングします。

以上が構造を知らずにネストされた JSON データをアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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