ホームページ  >  記事  >  バックエンド開発  >  動的コード駆動スキーマを使用して Go で任意の JSON データをアンマーシャルする方法

動的コード駆動スキーマを使用して Go で任意の JSON データをアンマーシャルする方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 08:22:30679ブラウズ

How to Unmarshall Arbitrary JSON Data in Go with a Dynamic Code-Driven Schema?

JSON と Go を使用した任意のデータのアンマーシャリング

特定の要件があります。それは、JSON データを処理できる方法でアンマーシャリングすることです。部品またはセクション。これを実現するには、データの前半、つまり「コード」が後半の解釈方法を示す構造を想定します。後半で考えられる 2 つの構造体は、Range と User です。

課題

Go の既存の json パッケージは、定義された構造体のマーシャリングとアンマーシャリングに便利な関数を提供しますが、任意のデータのニーズには対応しません。

ソリューションのデコード

この解決策には、メッセージ構造体に json.RawMessage フィールド (ペイロード) を導入することが含まれます。このフィールドを使用すると、前半で指定されたコードがわかるまでデータの解析を遅らせることができます。

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

<code class="go">type Message struct {
    Code    int
    Payload json.RawMessage
}
type Range struct {
    Start int
    End   int
}
type User struct {
    ID   int
    Pass int
}

// Custom unmarshalling function
func MyUnmarshall(m []byte) {
    var message Message
    json.Unmarshal(m, &message)
    var payload interface{}
    switch message.Code {
    case 3:
        payload = new(User)
    case 4:
        payload = new(Range)
    }
    json.Unmarshal(message.Payload, payload)
}</code>

使用法

この解決策を使用するには、まず json.Unmarshal 関数を使用して「上半分」をアンマーシャリングします。次に、「上半分」から取得したコードに基づいて、再度 json.Unmarshal 関数を使用して「下半分」をアンマーシャリングし、今回はターゲットの json.RawMessage オブジェクトを提供します。

<code class="go">json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
MyUnmarshall(json) // This will decode the data into a Range object</code>

考慮事項

この手法を使用すると、構造化された柔軟な方法で任意のデータのアンマーシャリングを処理できます。ただし、事前にコードを知っていることと、さまざまなコードに一致する構造体の存在を知ることに対する実行時の依存関係が生じます。

以上が動的コード駆動スキーマを使用して Go で任意の JSON データをアンマーシャルする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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