ホームページ  >  記事  >  バックエンド開発  >  「コード」に基づいてさまざまな構造を持つ任意の JSON データをアンマーシャリングする方法

「コード」に基づいてさまざまな構造を持つ任意の JSON データをアンマーシャリングする方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-30 10:21:03531ブラウズ

How to Unmarshal Arbitrary JSON Data with Varying Structures Based on a

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

質問:

JSON データをある方法でマーシャリングできますか部分またはセクションでアンマーシャルできるようにするにはどうすればよいですか?このシナリオでは、データの上半分は、下半分のデータのタイプを示す「コード」を定義します。これは構造体間で異なる場合があります。 Go ではどのようにしてこれを実現できますか?

答え:

下半分が構造体間で異なる可能性がある任意の JSON データをアンマーシャリングするには、下半分の解析を遅らせることができます。上半分の「コード」は既知です。

実装:

  1. int Code フィールドと json.RawMessage Payload フィールドを持つ Message struct を定義します。 。このフィールドには、解析されていない下半分が一時的に保存されます。
  2. コードに基づいてさまざまな構造体タイプを解析およびアンマーシャリングする関数を作成します。
  3. JSON データからメッセージ構造体をアンマーシャリングします。これにより、データの上半分が解析され、下半分の解析が遅れます。
  4. コードに基づいて、適切な構造体タイプのインスタンスを作成し、それにペイロードをアンマーシャリングします。

コード例:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
)

type Message struct {
    Code    int
    Payload json.RawMessage
}
type Range struct {
    Start int
    End   int
}
type User struct {
    ID   int
    Pass int
}

func MyUnmarshall(m []byte) {
    var message Message
    var payload interface{}
    json.Unmarshal(m, &message)
    switch message.Code {
    case 3:
        payload = new(User)
    case 4:
        payload = new(Range)
    }
    json.Unmarshal(message.Payload, payload)
    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>

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

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