golang中的json-rpc,id为字符串

时间:2013-03-30 01:41:55

标签: types go json-rpc

我很陌生。

我使用这个包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, &params, &reply, "application/json",
            gjson.EncodeClientRequest, DecodeClientResponse)

我发现这很难看,有什么方法可以做得更好吗?

由于

2 个答案:

答案 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,这应该可行。