如何使用serde读取JSON文件?

6
我想读取一个JSON文件并打印它的内容,我正在尝试使用serde crate,但不明白为什么这行不通:
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)
}

我收到的错误是:

the trait `std::fmt::Display` is not implemented for `Result<_, serde_json::Error>`

我该如何读取JSON文件?有没有更好的方法?在serde文档或其他地方,我都找不到完整的示例。

1个回答

9
你的代码有两个问题。首先,当解析JSON时你没有处理错误。就像 read_to_string() 返回一个 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

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)
}

您可以在项目页面上找到这种示例和更多示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接