5

我有一个 JSON 对象:

{"content":{"foo":1,"bar":2},"signature":"3f5ab1..."}

将其反序列化为自定义类型已经可以正常工作,使用:

let s: SignedContent = serde_json::from_str(string)?;

我想要的是{"foo":1,"bar":2}切片&[u8],以便我可以检查签名。

(我知道有关规范 JSON 表示的问题,并已采取缓解措施。)

目前,我正在浪费地将对象(在对象内)重新序列化为字符串并从中获取八位字节。ContentSignedContent

有没有更有效的方法?

4

1 回答 1

4

看起来像是一份工作serde_json::value::RawValue(可通过“raw_value”功能获得)。

对包含输入数据中单个有效 JSON 值的字节范围的引用。

ARawValue可用于将有效负载的部分解析推迟到以后,或者在部分有效负载只需要逐字传输到不同的输出对象的情况下完全避免解析它。

序列化时,此类型的值将保留其原始格式,并且不会被缩小或打印。

用法是:

#[derive(Deserialize)]
struct SignedContent<'a> {

    #[serde(borrow)]
    content: &'a RawValue,

    // or without the 'a
    //content: Box<RawValue>
}

然后,您可以使用content.get()来获取原始&str.

于 2020-10-04T09:09:07.297 回答