[英]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.