golang 使用json.rawmessage 避免反复转义的困境

371 阅读1分钟

场景

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 会报错