如何使用 serde 读取 JSON 文件?

tur*_*tle 3 rust

我想读取一个 JSON 文件并打印其内容。我正在尝试使用serde板条箱,但不明白为什么这不起作用:

use serde_json;
use std::fs;

fn main() {
    let path = "./src/input.json";
    let data = fs::read_to_string(path).expect("Unable to read file");
    let res = serde_json::from_str(&data);
    println!("{}", res)
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

use serde_json;
use std::fs;

fn main() {
    let path = "./src/input.json";
    let data = fs::read_to_string(path).expect("Unable to read file");
    let res = serde_json::from_str(&data);
    println!("{}", res)
}
Run Code Online (Sandbox Code Playgroud)

如何读取 JSON 文件?有一个更好的方法吗?我在serde文档或其他地方都找不到完整的例子。

use*_*342 5

您的代码有两个问题。首先,您在解析 JSON 时没有处理错误。就像read_to_string()返回 a一样,如果一切正常,Result您必须使用它expect()来获取基础值,这同样适用于serde_json::from_str().

添加缺失expect()导致第二个问题,编译器抱怨:

error[E0282]: type annotations needed
 --> src/main.rs:7:9
  |
7 |     let res = serde_json::from_str(&data).expect("Unable to parse");
  |         ^^^ consider giving `res` a type
Run Code Online (Sandbox Code Playgroud)

serde_json是强类型的,可以将 JSON 反序列化为您准备的 Rust 类型。如果您只想检查无类型的 JSON,您可以使用serde_json::Value( playground ):

use serde_json;
use std::fs;

fn main() {
    let path = "./src/input.json";
    let data = fs::read_to_string(path).expect("Unable to read file");
    let res: serde_json::Value = serde_json::from_str(&data).expect("Unable to parse");
    println!("{}", res)
}
Run Code Online (Sandbox Code Playgroud)

您可以在项目页面上找到此类示例以及更多内容。