为什么在尝试将 JSON 文件反序列化为 hashmap 时出错("trailing characters")?

Why Error("trailing characters") when trying to deserialize a JSON file to a hashmap?

所以基本上,我正在尝试使用 serde crate 将 JSON 文件反序列化为 hashmap,但是。 JSON 文件:

"
    [
        {
            "orchard_name": "Happy Apple",
            "tons": "5"
        },
        {
            "orchard_name": "Munch for Lunch",
            "tons": "2"
        }
    ]
    "

这是我的结构:

#[derive(Serialize, Deserialize, Debug)]
struct OrangeFarm
{
    map : HashMap<String,String>
}

这是我尝试进行反序列化的地方:

let res = serde_json::from_str(_json);
if res.is_ok() {println!("Deserealization worked."); }
else { println!("it went wrong"); }
let mut deserializedFarm : OrangeFarm = res.unwrap();

出于某种原因,如果我删除第二个 {},它会起作用,但如果我让第二个 {} 无效,因为我收到此错误“thread 'main' paniced at 'called Result::unwrap()Err 值上:错误(“尾随字符”。你知道为什么会这样吗?谢谢!

For some reason, it works if I delete the second {}, but it doesn't if I let the second {}

我不知道这意味着什么,但据我所知,它永远不会起作用:您正在尝试反序列化一个结构数组,但反序列化为一个结构。所以反序列化在逻辑上失败了。代码总是 panic,虽然在最初的情况下它 打印“它出错了”。

此外,您的结构定义与 JSON 不匹配,因此即使您尝试反序列化为 Vec<OrangeFarm>,调用也会失败:serde 期望找到 map 属性,JSON 中不存在。所以你需要修复你的结构,或者配置序列化/反序列化方案。

反序列化为 Vec<HashMap<String, String>> 会起作用,但我不知道这是否是您的意图。

除此之外:

  • 请在可能的情况下使用 play.rust-lang.org 提供 minimal complete runnable reproduction cases 并使用常规代码块在评论中显示案例,这些 html snippet things 显然不能用于 rust(尤其是当代码甚至不完整时)所以它们只是占用空间并破坏语法着色
  • 那里的代码有点……奇怪。人们通常不会检查 is_ok/is_err 然后立即解包,相反你会使用 matchif let 来同时干净利落地做这两件事并避免风险不同步、误解等...有些情况 unwrap.
  • 调用您正在使用的变量 _json 是异常的,_ 前缀用于您想要捕获但不想使用的变量(它抑制了 unused_variables lint 而不会立即删除该值,这将是单独 _).
  • 的效果