我想生成一个像这样的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"
}
有没有不同的方法来解决这个问题?
答案 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)
}
当然,您可以在时间之前编组一个值,以获得您的案例中的原始字节。