解組非同質性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
}
}
需要根據「code」欄位將「payload」欄位解組為對應的資料結構。
解決方案
關鍵這裡是使用 json.RawMessage 類型來延遲“payload”字段的解組,直到您知道它的類型。例如:
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