[]json.Rawmessage
的含义是什么?它在这个结构中:
type Request struct {
Jsonrpc string `json:"jsonrpc"`
Method string `json:"method"`
Params []json.RawMessage `json:"params"`
ID interface{} `json:"id"`
}
我知道它是json的一种类型。我不明白.RawMessage
指的是什么。我试着在golang tour和golang书中查找它。最后我知道Params
类型[]json.Rawmessage
被捆绑到另一个名为Request
Futhermore:
这些细分json:"jsonrpc"
发生了什么。字符串文字是否以某种方式附加到var?这不是golang之旅或我的golang书。谢谢你的时间。
答案 0 :(得分:1)
[]定义切片
json
是包import名称(来自上面的导入语句)
RawMessage
是包中的type。在这种情况下为[]字节类型。
json:"params"
是field tag。 json包用反射读取它并确定用于json的名称。
答案 1 :(得分:1)
大多数情况下,您需要查看软件包文档而不是某本书和在线游览。
json:"jsonrpc"
是一个结构标记
对于这种特定情况,json.Marshal函数将读取该struct标记并返回具有给定值的JSON字段名称。有关“encoding / json”结构标记用法的更多信息:https://golang.org/pkg/encoding/json/#Marshal
对于RawMessage,您可以在此处详细了解https://golang.org/pkg/encoding/json/#RawMessage
type RawMessage []byte
通常我在使用“通用”类型的JSON对象时不需要正确处理(也许我只是将它们发送到另一个服务,或者我将在以后根据条件解组)。例如(我将使用您的Request
结构):
jsonString := `[
{
"id": 123,
"method": "getSomething",
"params": [{"A": 1, "B": 2}]
}
{
"id": 123,
"method": "getSomethingElse",
"params": [{"C": 1, "D": 2}]
}
]`
使用此处理代码:
var requests []Request
json.Unmarshal([]byte(jsonString), &requests)
// if no error, you will have 2 items in requests
// requests[0].Params[0] is equal to []byte(`{"A": 1, "B": 2}`)
// requests[1].Params[0] is equal to []byte(`{"C": 1, "D": 2}`)
for _, req := range requests {
if req.Method == "getSomething" {
justProxyThisRequestToAnotherService(req)
} else if req.Method == "getSomethingElse" {
var params []map[string]int
json.Unmarshal(req.Params, ¶ms)
// then do something with params
}
}