如何解组/存储未知的json字段?

时间:2015-09-06 16:39:50

标签: json go

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

Play

Data

1 个答案:

答案 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)}}}