Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解析JSON文件?_Json_Rust - Fatal编程技术网

如何解析JSON文件?

如何解析JSON文件?,json,rust,Json,Rust,到目前为止,我的目标是在Rust中解析此JSON数据: extern crate rustc_serialize; use rustc_serialize::json::Json; use std::fs::File; use std::io::copy; use std::io::stdout; fn main() { let mut file = File::open("text.json").unwrap(); let mut stdout = stdout();

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

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

fn main() {
    let mut file = File::open("text.json").unwrap();
    let mut stdout = stdout();
    let mut str = &copy(&mut file, &mut stdout).unwrap().to_string();
    let data = Json::from_str(str).unwrap();
}
text.json

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

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

由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());
}

Serde是首选的JSON序列化提供程序。你可以。将其作为字符串后,请使用:

Cargo.toml:

[dependencies]
serde = { version = "1.0.104", features = ["derive"] }
serde_json = "1.0.48"
您甚至可以使用类似于从打开的
文件中直接读取的内容

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

use serde::Deserialize;

#[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,
}

fn main() {
    let the_file = /* ... */;

    let person: Person = serde_json::from_str(the_file).expect("JSON was not well-formatted");
    println!("{:?}", person)
}
使用serde::反序列化;
#[派生(调试、反序列化)]
#[serde(rename_all=“PascalCase”)]
结构人{
名字:String,
姓氏:String,
年龄:u8,
地址:地址:,
电话号码:Vec,
}
#[派生(调试、反序列化)]
#[serde(rename_all=“PascalCase”)]
结构地址{
街道:弦,
城市:字符串,
国家:字符串,
}
fn main(){
让_文件=/*…*/;
让person:person=serde_json::from_str(_文件);
println!(“{:?}”,person)
}

查看以了解更多详细信息。

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

假设您的
foo.json

{
    "FirstName": "John",
    "LastName": "Doe",
    "Age": 43,
    "Address": {
        "Street": "Downing Street 10",
        "City": "London",
        "Country": "Great Britain"
    },
    "PhoneNumbers": [
        "+44 1234567",
        "+44 2345678"
    ]
}
{
    "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);
}

这里有一个简单完整的示例,说明如何从文档中的文件中读取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");

看起来您阅读了正确的页面来解析它。你有没有看到页面下方看起来正是你想要的内容?@squiguy是的,我添加了
let obj=data.as_object().unwrap()并得到
线程“”在调用
Option::unwrap()`时惊慌失措,
None
value',C:/bo t/slave/stable-dist-rustc-win-32/build/src/libcore\Option.rs:362}发生未知错误`注意,rustc_serialize repo说它现在已被弃用,支持使用serde_json的答案。请用这个答案更清楚地说明什么是不同的和有用的,值得重复。与其他答案不同的是,没有描述如何从文件中获取字符串。这是一个完整的示例,演示了如何使用serde从一个单独的文件(foo.json)读取并将该字符串read_转换为_字符串,最后将其展开。此外,指向serde_json的链接不起作用,网站上的serde_json::from_reader()示例也不起作用。使用serde_json的答案已经存在。请用这个答案更清楚地说明什么是不同的和有用的,值得重复。