场景
jsonrpc中的场景
这是一个请求,params 只是一个[] string.
type JSONRequest struct {
Jsonrpc string `json:"jsonrpc"`
ID string `json:"id"`
Method string `json:"method"`
Params []string `json:"params"`
}
{
"jsonrpc":"2.0",
"method":"eth_subscribe",
"params":["newHeads"],
"id":1
}
那么我直接json.MarshalJSON就可以了可以完成了识别了。 但是,好久不长上线后发现有人往params塞**[["newHeads"]]** 于是golang因为是强类型导致无法识别参数所以无法到最后params为nil(不对应该是"")
例如这个请求
{ "jsonrpc": "2.0", "id": "1", "method": "state_subscribeStorage", "params": [["0x1234", "0x5678"]] }
代码:
type JSONRequest struct {
Jsonrpc string `json:"jsonrpc"`
ID string `json:"id"`
Method string `json:"method"`
Params *json.RawMessage `json:"params"`
}
注意点就是要初始化,不如铁定报错 nil 调用过程,变成你喜欢的模样
var ParamString []byte
if req.RPC.Params != nil {
ParamString, _ = req.RPC.Params.MarshalJSON()
}
到最后如果要变回 []bytes的时候就不会被多次转义了。
注意点: 1 如果string-> json.rawmessage -> json.Marshal 的时候 string 做一个判断 如果是 "" 的时候要 [] 或者 {},不然Marshal 会报错