我有一个复杂的 JSON 文件,我只想从中提取一个值。我可以定义所有structs 并Deserialize在所有这些s 上派生,但我只想编写一些手动代码来提取那个值。该SERDE文档,坦率地说,只是让我感到困惑。
我的 JSON 内容具有以下布局:
{
"data": [
{
"hostname": "a hostname"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找通过进入导航到的值data,然后获取数组的第一个元素,并获取hostname.
在 Haskell 中,我会这样做:
{
"data": [
{
"hostname": "a hostname"
}
]
}
Run Code Online (Sandbox Code Playgroud)
Serde 的等价物是什么?
serde_json为通用 JSON 值提供类型serde_json::Value:
use serde_json::Value;
// input variable
let input: &str = "{...}";
// parse into generic JSON value
let root: Value = serde_json::from_str(input)?;
// access element using .get()
let hostname: Option<&str> = root.get("data")
.and_then(|value| value.get(0))
.and_then(|value| value.get("hostname"))
.and_then(|value| value.as_str());
// hostname is Some(string_value) if .data[0].hostname is a string,
// and None if it was not found
println!("hostname = {:?}", hostname); // = Some("a hostname")
Run Code Online (Sandbox Code Playgroud)
(完整的操场示例)
如果你想恐慌如果该值缺失或畸形,我会使用的Index语法([...])。如果要处理丢失/格式错误的情况,请使用以下get方法:
fn main() {
let json_value = serde_json::json!({
"data": [
{
"hostname": "a hostname"
}
]
});
let host = &json_value["data"][0]["hostname"];
println!("Host: {:?}", host);
}
Run Code Online (Sandbox Code Playgroud)
let host = json_value.pointer("/data/0/hostname");
println!("Host: {:?}", host);
Run Code Online (Sandbox Code Playgroud)