为什么在尝试将 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
然后立即解包,相反你会使用 match
或 if let
来同时干净利落地做这两件事并避免风险不同步、误解等...有些情况 unwrap
.
- 调用您正在使用的变量
_json
是异常的,_
前缀用于您想要捕获但不想使用的变量(它抑制了 unused_variables
lint 而不会立即删除该值,这将是单独 _
). 的效果
所以基本上,我正在尝试使用 serde crate 将 JSON 文件反序列化为 hashmap
"
[
{
"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
然后立即解包,相反你会使用match
或if let
来同时干净利落地做这两件事并避免风险不同步、误解等...有些情况unwrap
. - 调用您正在使用的变量
_json
是异常的,_
前缀用于您想要捕获但不想使用的变量(它抑制了unused_variables
lint 而不会立即删除该值,这将是单独_
). 的效果