簡體   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