Marshal接口{}进入json

时间:2017-06-21 00:35:21

标签: json go encoding

我想生成一个像这样的json:

{
   "A": 1,
   "B": "bVal",
   "C": "cVal"
}

但我想保持我的代码足够通用,以便我可以替换密钥对" C"与我想要的任何其他类型的json对象。我尝试过类似下面的内容:

    type JsonMessage struct {
        A int `json:"A"`
        B string `json:"B,omitempty"`
        genericObj interface{} 
    }

    type JsonObj struct {
        C string `json:"C"`
    }

    func main() {
        myJsonObj := JsonObj{C: "cVal"}
        myJson := JsonMessage{A: 1, B: "bValue", genericObj: myJsonObj}

        body, _ := json.Marshal(myJson)
        fmt.Print(body)
    }

但输出就是这样:

{
   "A": 1,
   "B": "bVal"
}

有没有不同的方法来解决这个问题?

1 个答案:

答案 0 :(得分:5)

这正是json.RawMessage存在的原因。以下是Go文档中的一个示例:

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

func main() {
    h := json.RawMessage(`{"precomputed": true}`)

    c := struct {
        Header *json.RawMessage `json:"header"`
        Body   string           `json:"body"`
    }{Header: &h, Body: "Hello Gophers!"}

    b, err := json.MarshalIndent(&c, "", "\t")
    if err != nil {
        fmt.Println("error:", err)
    }
    os.Stdout.Write(b)

}

当然,您可以在时间之前编组一个值,以获得您的案例中的原始字节。