[英]How to unmarshall / store unknown json fields?
我需要從第三方API解組json。 盡管我知道響應類型,但是我需要確保我不會丟失API可能引入的任何字段(api沒有文檔),所以我想知道如何做到這一點。 理想情況下,我想將未知字段存儲在interface {}值中,並可能對其進行編碼以供以后審核。 這是到目前為止我嘗試過的方法,但是沒有用(在解組期間丟失了在編譯時“未知”的Data
字段)。
package main
import (
"encoding/json"
"fmt"
)
type Tweet struct {
User_id int
Message string
Unknown
}
type Unknown map[interface{}]interface{}
func main() {
// Define an empty interface
var t Tweet
// Convert JSON string into bytes
b := []byte(`{"user_id": 1, "message": "Hello world", "Date": "somerandom date"}`)
// Decode bytes b into interface i
json.Unmarshal(b, &t)
fmt.Println(t)
}
您可以按照inf建議使用RawMessage。 這是使用sharktanklabs j2n package的示例。
package main
import (
"encoding/json"
"fmt"
"github.com/sharktanklabs/j2n"
)
type TweetData struct {
User_id int
Message string
Overflow map[string]*json.RawMessage `json:"-"`
}
type Tweet struct {
TweetData
}
func (c *Tweet) UnmarshalJSON(data []byte) error {
return j2n.UnmarshalJSON(data, &c.TweetData)
}
func (c Tweet) MarshalJSON() ([]byte, error) {
return j2n.MarshalJSON(c.TweetData)
}
func main() {
// Define an empty interface
var t Tweet
// Convert JSON string into bytes
b := []byte(`{"user_id": 1, "message": "Hello world", "Date": "somerandom date"}`)
// Decode bytes b into interface i
json.Unmarshal(b, &t)
fmt.Printf("%#v\n", t)
}
// Formatted output:
// main.Tweet{TweetData:main.TweetData{
// User_id:1,
// Message:"Hello world",
// Overflow:map[string]*json.RawMessage{
// "user_id":(*json.RawMessage)(0xc82000e340),
// "message":(*json.RawMessage)(0xc82000e3c0),
// "Date":(*json.RawMessage)(0xc82000e440)}}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.