繁体   English   中英

为什么在尝试将 JSON 文件反序列化为 hashmap 时出现错误(“尾随字符”)?

[英]Why Error(“trailing characters”) when trying to deserialize a JSON file to a hashmap?

所以基本上,我正在尝试使用 serde crate 将 JSON 文件反序列化为 hashmap<String,String> ,但是。 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();

出于某种原因,如果我删除第二个 {},它会起作用,但如果我让第二个 {} 则不起作用,因为我收到此错误“线程 'main' 在Err值上调用Result::unwrap()时惊慌失措:错误(“尾随字符”。你知道为什么会发生这种情况吗?谢谢!

出于某种原因,如果我删除第二个 {},它会起作用,但如果我让第二个 {} 则不会

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

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

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

除此之外:

  • 请在可能的情况下使用 play.rust-lang.org 提供最小的完整可运行再现案例(在此处),并使用常规代码块在评论中显示案例,这些 html 片段显然不适用于 rust(特别是当代码甚至不完整时)所以它们只是占用空间并破坏语法着色
  • 有什么小代码......奇怪。 通常不会检查is_ok / is_err然后立即展开,而是使用matchif let同时干净地执行这两项操作,并避免不同步、误解等的风险......有些情况下unwrap
  • 调用您正在积极使用的变量_json是异常的, _前缀用于您想要捕获但不想使用的变量(它会抑制未使用的unused_variables lint 而不会立即删除该值,这将是一个单独的效果_ )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM