特定のシナリオでは、部分またはセクションの JSON データをアンマーシャリングする必要がある場合があります。たとえば、データの上半分は、上半分の「コード」に基づいて特定の構造体にアンマーシャリングするなど、下半分で実行するアクションを示している場合があります。
次のサンプル構造を考えてみましょう。
<code class="go">type Range struct { Start int End int } type User struct { ID int Pass int }</code>
例として、JSON データは次のようになります。
<code class="json">// Message with "Code" 4, signifying a Range structure { "Code": 4, "Payload": { "Start": 1, "End": 10 } } // Message with "Code" 3, signifying a User structure { "Code": 3, "Payload": { "ID": 1, "Pass": 1234 } }</code>
この非整列化を実現するには、決定するまで JSON データの下半分の解析を遅らせることができます。上半分のコード。次のアプローチを検討してください。
<code class="go">import ( "encoding/json" "fmt" ) type Message struct { Code int Payload json.RawMessage // Delay parsing until we know the code } func MyUnmarshall(m []byte) { var message Message var payload interface{} json.Unmarshal(m, &message) // Delay parsing until we know the color space switch message.Code { case 3: payload = new(User) case 4: payload = new(Range) } json.Unmarshal(message.Payload, payload) // Error checks omitted for readability fmt.Printf("\n%v%+v", message.Code, payload) // Perform actions on the data } 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 データを効果的にアンマーシャリングできます。
以上がコードに基づいてセクション内の任意の JSON データをアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。