ホームページ  >  記事  >  バックエンド開発  >  コード値に基づいて JSON データを動的にアンマーシャリングする方法

コード値に基づいて JSON データを動的にアンマーシャリングする方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 04:22:02838ブラウズ

How to Unmarshall JSON Data Dynamically Based on a Code Value?

任意のデータのアンマーシャリング

多くのシナリオでは、アンマーシャリング プロセスがさまざまな環境に適応できるように、柔軟な方法で JSON データをアンマーシャリングする必要があります。所定のコード値に基づくデータ構造。これにより、さまざまなソースから受信したデータを動的に解釈できるようになります。

たとえば、「ペイロード」フィールドに含まれるデータのタイプを指定する「コード」フィールドを含む JSON メッセージを考えてみましょう。 「ペイロード」フィールドは、「コード」値に応じて異なるデータ構造を表すことができます。

これを実現するには、次の手法を使用できます。

<code class="go">package main

import (
    "encoding/json"
    "fmt"
)

type Message struct {
    Code    int
    Payload json.RawMessage // delay parsing until we know the code
}

// Define the possible data structures that can be unmarshalled from the "payload" field
type Range struct {
    Start int
    End   int
}
type User struct {
    ID   int
    Pass int
}

// Custom unmarshalling function
func MyUnmarshall(m []byte) {
    var message Message
    var payload interface{}
    json.Unmarshal(m, &message) // delay parsing until we know the color space

    // Determine the data structure based on the "code" field
    switch message.Code {
    case 3:
        payload = new(User)
    case 4:
        payload = new(Range)
    }

    // Unmarshall the "payload" field into the appropriate data structure
    json.Unmarshal(message.Payload, payload) //err check ommited for readability

    // Do something with the unmarshalled data
    fmt.Printf("\n%v%+v", message.Code, payload)
}

func main() {
    json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
    MyUnmarshall(json)
    json = []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`)
    MyUnmarshall(json)
}</code>

この例では、 MyUnmarshall 関数は、JSON メッセージを受信し、「コード」フィールドと「ペイロード」フィールドをメッセージ構造体に保存し、「コード」値に基づいてデータ構造インスタンスを動的に作成します。その後、「ペイロード」フィールドを適切な構造にアンマーシャリングし、アンマーシャリングされたデータに対して必要なアクションを実行します。

以上がコード値に基づいて JSON データを動的にアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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