到目前为止,我的目标是在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。
答案 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。
以下是以下内容的简短摘要:
享受:
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);
}