繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM