我很陌生。
我使用这个包https://github.com/kdar/httprpc来执行我的json-rpc v 1.0请求(因为golang只实现了2.0)
我有一个问题,我正在调用此服务器将“id”作为字符串返回,如
"id":"345"
而不是
"id":345
我找到的唯一方法是使用字符串而不是uint64重新定义clientResponse
type clientResponse struct {
Result *json.RawMessage `json:"result"`
Error interface{} `json:"error"`
Id string `json:"id"`
}
并重新定义exacte相同的DecodeClientResponse函数以使用我的clientResponse
而不是CallJson,我调用(DecodeClientResponse而不是gjson.DecodeClientResponse):
httprpc.CallRaw(address, method, ¶ms, &reply, "application/json",
gjson.EncodeClientRequest, DecodeClientResponse)
我发现这很难看,有什么方法可以做得更好吗?
由于
答案 0 :(得分:2)
json-rpc v 1.0指定:
id - 请求ID。这可以是任何类型。它用于将响应与其回复的请求进行匹配。
也就是说,id
可以是任何东西(甚至是数组),服务器响应应该包含相同的id值和类型,在您的情况下它不会。因此,与您通信的服务器无法正常工作,并且不遵循json-rpc v 1.0规范。
所以,是的,你需要做“丑陋”的解决方案,并为这个“破碎”的服务器创建一个新的解码器功能。 Jeremy Wall的建议有效(但int
应更改为uint64
),至少应该让您避免使用string
作为类型。
修改强>
我不知道httprpc
包足以知道它如何处理Id
值。但是如果你想要字符串或int,你应该能够将clientResponse
中的Id设置为:
Id interface{} `json:"id"`
检查Id
中的值时,使用类型开关:
var id int
// response is of type clientResponse
switch t := response.Id.(type) {
default:
// Error. Bad type
case string:
var err error
id, err = strconv.Atoi(t)
if err != nil {
// Error. Not possible to convert string to int
}
case int:
id = t
}
// id now contains your value
答案 1 :(得分:1)
尝试
type clientResponse struct {
Result *json.RawMessage `json:"result"`
Error interface{} `json:"error"`
# Tell encoding/json that the field is
# encoded as a json string even though the type is int.
Id int `json:"id,string"`
}
只要库在使用编码/ json,这应该可行。