2 回答

TA貢獻1719條經驗 獲得超6個贊
您可以使用 json.RawMessage
RawMessage 是一個原始編碼的 JSON 對象。它實現了 Marshaler 和 Unmarshaler,可用于延遲 JSON 解碼或預計算 JSON 編碼。
此外,json.RawMessage它是一個別名,[]byte因此您可以通過這種方式對其進行賦值:
v := json.RawMessage(`{"foo":"bar"}`)
例子:
package main
import (
"encoding/json"
"fmt"
)
type Event struct {
Place json.RawMessage `json:"place"`
Attendees json.RawMessage `json:"attendees"`
}
func main() {
e := Event{
Place: json.RawMessage(`{"address":"somewhere"}`),
Attendees: json.RawMessage(`{"key":"value"}`),
}
c, err := json.Marshal(&e)
if err != nil {
panic(err)
}
fmt.Println(string(c))
// {"place":{"address":"somewhere"},"attendees":{"key":"value"}}
}

TA貢獻1836條經驗 獲得超4個贊
是的,您可以使用實現Marshaler接口的自定義類型。
https://play.golang.org/p/YB_eKlfOND
package main
import (
"fmt"
"encoding/json"
)
type Event struct {
Place RawString `json:"place"`
Attendees RawString `json:"attendees,omitempty"`
}
type RawString string
func (s RawString) MarshalJSON() ([]byte, error) {
return []byte(s), nil
}
func main() {
event := Event{
Place: RawString(`{"name":"Paris"}`),
Attendees: RawString(`[{"name":"John"}, {"name":"Juli"}]`),
}
s, err := json.Marshal(event)
fmt.Println(fmt.Sprintf("event: %v; err: %v", string(s), err))
}
- 2 回答
- 0 關注
- 179 瀏覽
添加回答
舉報