不同 Json 结构的 Yew 回调

Yew callback for different Json structs

我将 yew 与 WebsocketService 一起使用,并将 jsonrpc 发送到后端并接收相应的答案。我在区分有效和错误的 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 结构上进行某种匹配吗?作为奖励问题:是否有可能解析结果类型不同于 String 的有效响应?

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

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

Is there a possibility to parse valid response with a result type different than String?

是的,我强烈建议您在那里使用您的自定义类型。您可以使用任何实现 Deserialize 特征的类型来代替 String。您可以阅读 here 如何实现 Deserialize 或仅将 derive 用于您的结构,就像您在上面所做的那样。