ホームページ  >  記事  >  バックエンド開発  >  構造が不明な入れ子になった JSON を効率的にアンマーシャリングするにはどうすればよいですか?

構造が不明な入れ子になった JSON を効率的にアンマーシャリングするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-04 05:02:29351ブラウズ

How to Unmarshall Nested JSON with Unknown Structure Efficiently?

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

このシナリオでは、キーと値に格納された不明な構造を持つ JSON データを処理します。店。データベースからエントリを取得するときは、最初に、トップレベルの名前空間を処理するために、map[string]*json.RawMessage にアンマーシャリングします。ただし、ネストされたデータをさらにアンマーシャルするには、使用する特定の構造体を決定する必要があります。

1。繰り返しのアンマーシャルの回避:

アンマーシャルを繰り返すと、パフォーマンスに影響を与える可能性があります。ただし、データ構造やアクセスパターンによっては必要となる場合があります。アンマーシャリングの速度が重要な場合は、アンマーシャリングされた結果をキャッシュすることを検討してください。

2.構造体の型の決定:

方法 A: インターフェイスへのアンマーシャル

  • json.RawMessage を map[string]interface{} にアンマーシャルします。
  • 「タイプ」に関連付けられた値を確認しますkey。
  • switch ステートメントまたはリフレクションを使用して、正しい構造体を決定します。

方法 B: 正規表現

  • 使用JSON データから「type」文字列を抽出するための正規表現。
  • 構造体のマップを作成する可能な「type」文字列に関連付けられたタイプ。
  • json.RawMessage を対応する構造体にアンマーシャリングします。

例:

方法A:

<code class="go">type RawData struct {
    Id       string `json:"id"`
    Type      string `json:"type"`
    RawData   []int  `json:"rawdata"`
    Epoch     string `json:"epoch"`
}

// Unmarshal to interface
data := make(map[string]interface{})
json.Unmarshal(*objmap["foo"], &data)

// Determine struct type
switch data["type"] {
case "baz":
    baz := &RawData{}
    json.Unmarshal(*objmap["foo"], baz)
case "bar":
    bar := &BarData{}
    json.Unmarshal(*objmap["foo"], bar)
}

// Custom struct for nested data
type BarData struct {
    Id       string `json:"id"`
    Type      string `json:"type"`
    RawData   []QuxData  `json:"rawdata"`
    Epoch     string `json:"epoch"`
}

type QuxData struct{
    Key string `json:"key"`
    Values []int `json:"values`
}</code>

メソッド B:

<code class="go">// Regular expression to extract type
typeRegex := regexp.MustCompile(`"type": "(.+?)"`)

// Get "type" string
typeString := string(typeRegex.Find(*objmap["foo"]))

// Map of struct types
structMap := map[string]interface{}{
    "baz": &RawData{},
    "bar": &BarData{},
}

// Unmarshal to corresponding struct
dataStruct := structMap[typeString]
json.Unmarshal(*objmap["foo"], dataStruct)</code>

これらのメソッドのいずれかを実装することで、JSON をアンマーシャリングするための正しい構造体を決定できます。 RawMessage を追加すると、ネストされたデータに効率的にアクセスできるようになります。

以上が構造が不明な入れ子になった JSON を効率的にアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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