非同種の JSON データのアンマーシャリング
この調査は、特定のセクションの選択的なアンマーシャリングを可能にするメカニズムを活用して、JSON データを効率的にアンマーシャリングすることに焦点を当てています。またはセグメント。目的は、最初の部分が後の部分に含まれるデータのタイプを決定する「コード」として機能する JSON 構造を処理することです。
複数のデータ構造があるシナリオを想像してください:
type Range struct {
Start int
End int
}
type User struct {
ID int
Pass int
}
そして、JSON メッセージには、「ペイロード」フィールドにどのようなデータがあるかを示す「コード」フィールドがあります:
{
"Code": 4,
"Payload": {
"Start": 1,
"End": 10
}
}
{
"Code": 3,
"Payload": {
"ID": 1,
"Pass": 1234
}
}
「コード」フィールドに基づいて、「ペイロード」フィールドを適切なデータ構造にアンマーシャルする必要があります。
ソリューション
キーここでは、 json.RawMessage タイプを使用して、そのタイプがわかるまで「ペイロード」フィールドのアンマーシャリングを遅らせます。例:
package main
import (
"encoding/json"
"fmt"
)
type Message struct {
Code int
Payload json.RawMessage // Delay parsing until we know the code
}
// Unmarshall into appropriate structures based on Code
func unmarshal(m []byte) error {
var message Message
err := json.Unmarshal(m, &message)
if err != nil {
return err
}
switch message.Code {
case 3:
var user User
if err := json.Unmarshal(message.Payload, &user); err != nil {
return err
}
fmt.Printf("Unmarshalled a User: %#v\n", user)
case 4:
var range Range
if err := json.Unmarshal(message.Payload, &range); err != nil {
return err
}
fmt.Printf("Unmarshalled a Range: %#v\n", range)
default:
return fmt.Errorf("unknown code: %d", message.Code)
}
return nil
}
func main() {
json1 := []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`)
if err := unmarshal(json1); err != nil {
fmt.Printf("error: %v\n", err)
}
json2 := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
if err := unmarshal(json2); err != nil {
fmt.Printf("error: %v\n", err)
}
}
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3