【问题标题】:Deserializing a String with into_serde makes the app panick使用 into_serde 反序列化字符串会使应用程序恐慌
【发布时间】:2020-11-03 19:27:19
【问题描述】:

和我的一个朋友,我们正在尝试使用serde_json crate 来反序列化 WebSocket 发送的一些消息。

我们遇到了一个特定错误,我们设法使用以下 sn-p 代码重新创建它:

use serde::{Deserialize, Serialize};

#[derive(Deserialize, Debug)]
struct EffetSer {
    test: String
}

fn main() {
   let test_value = JsValue::from_str("{\"test\": \"value\"}");
   let test_value: EffetSer = test_value.into_serde().unwrap();
   log::error!("WOW : {:?}", test_value);
}

我们的 TOML 有以下依赖:

wasm-bindgen = { version = '0.2.63', features = ['serde-serialize'] }
serde = { version = '1.0', features = ["derive"] }
serde_json = '1.0.55'
js-sys = '0.3.40'

错误如下:

app.js:310 panicked at 'called `Result::unwrap()` on an `Err` value: Error("invalid type: string \"{\\\"test\\\": \\\"value\\\"}\", expected struct EffetSer", line: 1, column: 23)'

非常感谢任何帮助,因为我们仍在努力了解我们做错了什么以及为什么我们无法反序列化我们的 String

【问题讨论】:

  • 什么是Component?我在您的依赖项中找不到它。如果您提供一个最小的可重现示例,将会有所帮助。
  • 你说的很对,很抱歉我应该放一个主要的。我正在编辑我的原始帖子。
  • 我相信问题出在JsValue。因为使用 serde 只能正常工作:let eff: EffetSer = serde_json::from_str("{\"test\": \"value\"}").unwrap();

标签: rust webassembly serde serde-json


【解决方案1】:

问题很可能是对into_serde的语义有误解。

根据documentation,它是这样工作的:

对该值调用 JSON.stringify,然后将生成的 JSON 解析为任意 Rust 值。

换句话说,它的语义如下:

  • JsValue的每个组件转换为对应的serde内部元素;
  • 从给定的组件树中反序列化所需的类型。

现在,这在我们的案例中意味着什么?好吧,您使用JsValue::from_str 创建了JsValue,同样根据文档,

创建一个新的 JS 值,它是一个字符串。

所以,这里的JsValue 不是一个对象,正如您可能假设的那样;它是一个原语 - 一个字符串,恰好具有对象 JSON 表示的形状。然后,当您调用 from_serde 时,Serde 会看到字符串 - 不是作为输入,而是作为内部表示,不能转换为对象。


现在,该怎么办?有几种方法可以修复此代码:

  1. 首先也是最明显的:根本不要使用JsValue,直接使用serde_json::from_str&str反序列化。
  2. 使用js_sys::JSON::parse从字符串中得到类似对象的JsValue,然后用into_serde将其转换为EffetSer。这可能效率较低,因为它需要 JSON::parseJSON::serialize 的往返将字符串转换为对象,然后再转换回字符串。
  3. 编写您自己的方法,将JsValue 直接转换为EffetSer。但是,我不确定这是否可行,因为我无法找到从 JS 对象中提取单个字段的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2013-01-18
    • 2013-05-07
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多