不同 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
用于您的结构,就像您在上面所做的那样。
我将 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
用于您的结构,就像您在上面所做的那样。