我需要从第三方API解组json。虽然我知道响应类型我需要确保我不会丢失API可能引入的任何字段(api没有文档)所以我想知道我该怎么做。理想情况下,我希望将未知字段存储在interface {}值中,并可能对其进行编码以供以后审计。这是我到目前为止所尝试的但是它不起作用(编译时“{1}}字段在编组时丢失了”。
Data
答案 0 :(得分:0)
您可以使用RawMessage作为inf建议。以下是使用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)}}}