go - 去 un/marshal 结构为 json
问题描述
我需要将 json rpc 消息包装在一个 go 结构中这是我的第一个想法,它适用于这样的传出消息
// Message wrapper
type Message struct {
ID *string `json:"id,omitempty"`
JSONRPC string `json:"jsonrpc"`
Method *string `json:"method,omitempty"`
Params *interface{} `json:"params,omitempty"`
Result *interface{} `json:"result,omitempty"`
}
// NewNotification creates a RPC Notification
func NewNotification(method string, params interface{}) Message {
m := Message{}
m.JSONRPC = "2.0"
m.Method = &method
m.Params = ¶ms
return m
}
type Test struct {
A string `json:"a"`
B string `json:"b"`
}
t := Test{"abc", "def"}
m := NewNotification("testMethod", t)
socket.WriteJSON(m)
但是现在对于接收方向,我的
Params *interface{}
声明有问题。
我Params
通过该字段识别有效负载类型,Method
并希望将其解组Params
为该结构......但因此我需要该类型
json.RawMessage
才能Params
使其正常工作。
我不想定义一个MessageIn
和MessageOut
结构!
m := Message{}
socket.ReadJSON(m)
t := Test{}
json.Unmarshal(m.Params, &t)
解决方案
您应该将json.RawMessage
用作您的参数和结果字段的类型。这将延迟这些字段的解码,直到您知道接收端的方法是什么。查看文档和示例:这是相同的用例:https ://golang.org/pkg/encoding/json/#RawMessage
推荐阅读
- r - 将多个参数传递给应用中的函数
- javascript - 用于验证字数小于 100 的正则表达式
- python-3.x - AddSpacer 有奇怪的颜色
- php - Laravel 中未定义的索引值
- reactjs - 'getPastEvents' 没有响应
- python - 如何检查 Python 枚举中项目的顺序?
- flutter - Flutter - 剪切文本忽略分词
- scala - Spark File Streaming 获取文件名
- android - android 9上的Flutter WebView插件错误
- flutter - 在 Android studio 中遇到 Dart 分析服务器错误