我如何解析JSON文件?

时间:2015-05-17 22:20:11

标签: json rust

到目前为止,我的目标是在Rust中解析此JSON数据:

text.json

{ "FirstName": "John", "LastName": "Doe", "Age": 43, "Address": { "Street": "Downing Street 10", "City": "London", "Country": "Great Britain" }, "PhoneNumbers": [ "+44 1234567", "+44 2345678" ] }

class MyClass {
    public static int myMethod() { ... }
}

解析它的下一步应该是什么?我的主要目标是获取这样的JSON数据,并从中解析一个密钥,如Age。

4 个答案:

答案 0 :(得分:23)

由Rust社区的许多有用成员解决:

extern crate rustc_serialize;
use rustc_serialize::json::Json;
use std::fs::File;
use std::io::Read;

fn main() {
    let mut file = File::open("text.json").unwrap();
    let mut data = String::new();
    file.read_to_string(&mut data).unwrap();

    let json = Json::from_str(&data).unwrap();
    println!("{}", json.find_path(&["Address", "Street"]).unwrap());
}

答案 1 :(得分:17)

Serde是首选的JSON序列化提供程序。你可以read the JSON text from a file a number of ways。将字符串作为字符串后,请使用serde_json::from_str

File

您甚至可以使用serde_json::from_reader之类的内容直接从已打开的#[macro_use] extern crate serde_derive; #[derive(Debug, Deserialize)] #[serde(rename_all = "PascalCase")] struct Person { first_name: String, last_name: String, age: u8, address: Address, phone_numbers: Vec<String>, } #[derive(Debug, Deserialize)] #[serde(rename_all = "PascalCase")] struct Address { street: String, city: String, country: String, } 进行阅读。

Serde可以用于JSON以外的格式,它可以序列化和反序列化为自定义结构而不是任意集合:

let person: Person = serde_json::from_str(the_file).expect("JSON was not well-formatted");
println!("{:?}", person)
{{1}}

查看Serde website了解详情。

答案 2 :(得分:3)

serde_json::de::from_reader文档中有一个简短完整的示例,说明如何从文件读取JSON。

以下是以下内容的简短摘要:

  • 读取文件
  • 将其内容解析为JSON
  • 并使用所需键提取字段

享受:

let file = fs::File::open("text.json")
    .expect("file should open read only");
let json: serde_json::Value = serde_json::from_reader(file)
    .expect("file should be proper JSON");
let first_name = json.get("FirstName")
    .expect("file should have FirstName key");

答案 3 :(得分:0)

(接受帮助)对接受的答案进行了投票(但有帮助),只是使用@FrickeFresh引用的serde_json板条箱添加了我的答案

假设您的foo.json

{
    "name": "Jane",
    "age": 11
}

实施看起来像

extern crate serde;
extern crate json_serde;
#[macro_use] extern crate json_derive;
use std::fs::File;
use std::io::Read;

#[derive(Serialize, Deserialize)]
struct Foo {
    name: String,
    age: u32,
}

fn main() {
   let mut file = File::open("foo.json").unwrap();
   let mut buff = String::new();
   file.read_to_string(&mut buff).unwrap();

   let foo: Foo = serde_json::from_str(&buff).unwrap();
   println!("Name: {}", foo.name);
}