错误:必须在此上下文(Rust)/ serde_json值中知道此值的类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误:必须在此上下文(Rust)/ serde_json值中知道此值的类型相关的知识,希望对你有一定的参考价值。
我正在使用serde_json来反序列化一个json文档。我有一个函数给出一个字符串(这是json文档),将返回一个serde_json值(这是一个表示json类型的枚举),返回一个Option。该值根据需要传递给其他函数。
然而,我意识到传递一个Value并不是我想要的,因为这样做,关键是不可用的。
为了说明我的观点,如果我有一个如下所示的json文档:
{
"root" : {
"regex" : null,
"prefixes" : [ "a_", "b_" ]
}
}
“root”是一个json对象,“regex”是json Null,“prefixes”是json数组。
现在,json类型值是一个带有表示json类型的鉴别符的枚举,例如上面给出的例子中的Object,Null,Array。
serde_json crate使用std :: collections :: BTreeMap来表示json文档中的节点,其中String类型重复json键(在上面,这些将是“root”,“regex”和“prefixes”。所以传遍只是对Values的引用只是部分有用,我应该绕过BTreeMap,这样我也可以访问键。
所以这是我试图重写的以下函数:
fn get_json_content(content_s : &str) -> Option<Value> {
// instead of returning a value, we need to return a BTreeMap, so we can get the
// key and the value.
println!("===>>> json_content obtained: {}", content_s);
match serde_json::from_str(content_s) { // -> Result<Value>
Ok(some_value) => Some(some_value),
Err(_) => None
}
}
所以我开始重新编写该函数,但是在这个上下文中出现了“必须知道此值的类型”错误:
fn get_json_content_as_btreemap<'a>(content_s : &str) -> Option<&'a BTreeMap<String, Value>> {
match serde_json::from_str(content_s) { // -> Result<Value>
Ok(some) => {
// I expect the type of key_value_pair to be BTreeMap<String, Value>>
// (but I may be wrong!)
let key_value_pair = some.as_object().unwrap(); // Error here
},
Err(_) => None
}
}
我发现了像stackoverflow这样的其他问题:the type of this value must be known in this context
并使用它作为帮助,我试图插入类型如下:
let key_value_pair = some.as_object::<BTreeMap<_, _>>().unwrap();
这不能解决问题。此外,尝试其他类似的变化无济于事。那我该怎么办?
编辑:
我在这个应用程序中有另一个功能如下:
fn get_root_value<'a>(json_documemt : &'a Value) -> Result<&'a Value, JsonErrorCode> {
if json_documemt.is_object() {
for (k, v) in json_documemt.as_object().unwrap().iter() {
if k == "root" {
println!("found root: {}", k);
return Ok(v)
}
}
return Err(JsonErrorCode::Custom("Failed to find root node".to_string()))
}
Err(JsonErrorCode::Custom("Not an object".to_string()))
}
......这很好用。在这里你可以看到我可以调用as_object()然后获取键和值作为元组对。我不明白为什么as_object在一个案例中工作而在另一个案例中不工作。我想拉出BTreeMap并将其作为借来的项目传递。
您可以更改初始函数的返回类型,如果可以,serde_json
将反序列化为相应的对象:
fn get_json_content(content_s : &str) -> Option<BTreeMap<String, Value>> {
// instead of returning a value, we need to return a BTreeMap, so we can get the
// key and the value.
println!("===>>> json_content obtained: {}", content_s);
match serde_json::from_str(content_s) { // -> Result<Value>
Ok(some_value) => Some(some_value),
Err(_) => None
}
// Note: this match statement can be rewritten as
// serde_json::from_str(content_s).ok()
}
您的第二个示例将无法工作,因为您正在实例化函数内部的Value
对象,然后尝试返回对刚刚实例化的对象的引用。这将无效,因为该对象将在函数末尾超出范围,然后引用将无效。
以上是关于错误:必须在此上下文(Rust)/ serde_json值中知道此值的类型的主要内容,如果未能解决你的问题,请参考以下文章
TSQL 错误:不能在此上下文中使用具有返回值的 RETURN 语句
nUnit 新手,遇到错误……“在此上下文中无法访问,因为它是‘公共’”
XSD 架构错误:XmlSchema 错误:元素 http://www.w3.org/2001/XMLSchema:element 在此上下文中无效