0

我将 yew 与 WebsocketService 一起使用,并将 jsonrpcs 发送到后端并接收相应的答案。我很难区分有效和错误的 jsonrpc 答案。在模型实现中,我通过以下方式创建回调:

let callback = self.link.callback(|Json(data)| {
    Msg::WsCallback(data)
});

WsCallback 是带有实际响应的消息:

pub enum Msg {
    // ...
    WsCallback(Result<WsResponse, Error>),
}

响应是实际的 JsonRpc 格式:

#[derive(Deserialize)]
pub struct WsResponse {
    jsonrpc: String,
    result: String,
    id: i32,
}

适用于有效答案,但如何处理 JsonRpc 响应的错误情况,如下所示:

#[derive(Deserialize)]
pub struct JsonRpcError{
    code: i32,
    message: String,
}

#[derive(Deserialize)]
pub struct WsResponseErr {
    jsonrpc: String,
    error: JsonRpcError,
    id: i32,
}

我可以对 Json 结构进行某种匹配吗?作为奖励问题:是否有可能解析具有不同于字符串的结果类型的有效响应?

4

1 回答 1

1

您应该使用两种类型的包装器并添加untagged属性serde

#[derive(Deserialize)]
#[serde(untagged)]
pub enum JsonRpcResult {
    Ok(WsResponse),
    Err(WsResponseErr),
}

是否有可能解析结果类型不同于字符串的有效响应?

是的,我强烈建议您在那里使用您的自定义类型。您可以使用任何实现Deserializetrait 的类型而不是String. 您可以在此处阅读如何实现Deserialize或仅将derive您的结构用于您在上面已经完成的操作。

于 2020-08-30T10:35:14.000 回答