json - 如何在Rust中搜索和解析任意长的JSON文件?

标签 json rust

因此,我和一个 friend 正在Rust中创建自己的包管理器,我们需要为其解析JSON。我们找到了Rust Programming Tutorial #42 - Parsing JSON,它向我们展示了如何操作的基础知识,但是在我们的情况下,我们正在解析的文件可能小至1个条目,大至1000个(或更多!)。这是我们需要解析的JSON格式:

[
    {
    "Name": "libexample",
    "Version": "5.0.0",
    "Depends": "dependency1, dependency2, dependency3",
    "Maintainer": "example@example.com",
    "Author": "person@author.com",
    "Homepage": "www.homepage.com",
    "Depiction": "package.depiction.com/file.json",
    "Description": "This  package contains an example!",
    "State": "Stable",
    "Provides": "Example",
    "Replaces": "Free space on your hard drive",
    "OS": "darwin, linux",
    "Architecture": "amd64"
    },
    {
    "Name": "libexample",
    "Version": "6.0.0",
    "Depends": "dependency1, dependency2, dependency3",
    "Maintainer": "example@example.com",
    "Author": "person@author.com",
    "Homepage": "www.homepage.com",
    "Depiction": "package.depiction.com/file.json",
    "Description": "This  package contains an example!",
    "State": "Beta",
    "Provides": "Example",
    "Replaces": "Free space on your hard drive",
    "OS": "darwin, linux",
    "Architecture": "amd64"
    },
    {
    "Name": "libexample",
    "Version": "7.0.0",
    "Depends": "dependency1, dependency2, dependency3",
    "Maintainer": "example@example.com",
    "Author": "person@author.com",
    "Homepage": "www.homepage.com",
    "Depiction": "package.depiction.com/file.json",
    "Description": "This  package contains an example!",
    "State": "Alpha",
    "Provides": "Example",
    "Replaces": "Free space on your hard drive",
    "OS": "darwin, linux",
    "Architecture": "amd64"
    },
    {
    "Name": "libanotherexample",
    "Version": "3.8.2",
    "Depends": "dependency1, dependency2, dependency3",
    "Maintainer": "example@example.com",
    "Author": "person@author.com",
    "Homepage": "www.homepage.com",
    "Depiction": "package.depiction.com/file.json",
    "Description": "This  package contains an example!",
    "State": "Stable",
    "Provides": "Another example",
    "Replaces": "Free space on your hard drive",
    "OS": "darwin, linux",
    "Architecture": "amd64"
    }
]

我们的问题是我们不知道如何解析可能会很长的文件,也不知道如何搜索它们。例如,如果有人查找软件包名称,我们如何搜索整个文件以使其与名称条目之一匹配,然后显示该软件包的其余信息?

最佳答案

    extern crate rustc_serialize;
extern crate serde_json;
extern crate serde;
extern crate serde_derive;
use std::fs::File;
use std::io::Read;
use std::str;
use serde_derive::Serialize;
use serde_derive::Deserialize;
#[derive(Serialize ,Deserialize)]
struct Person{
    first_name: String,
    last_name: String,
    age: i64,
    }
    impl Person{
        fn show(&self){
            println!("First_Name:{}   Last_Name:{}   Age:{}",self.first_name,self.last_name,self.age);
        }
    }

fn main() {
    let mut file = File::open("text.json").unwrap();
    let mut data = Vec::new();
    file.read_to_end(&mut data).unwrap();
  let s = match str::from_utf8(&data) {
    Ok(v) => v,
    Err(e) => panic!("Invalid UTF-8 sequence: {}", e),
};
let values: Vec<_> = s.split("},").collect();
   let  mut i=0;
    while i<values.len(){
        let mut str1=values[i].to_string();
        if i==0{
             str1 = str1.replace("[", "");
            str1=str1+"}";
        }
        else if i==values.len()-1{
             str1 = str1.replace("]", "");
        }
        else{
            str1=str1.to_string()+"}";

        }
      let res=serde_json::from_str(&str1);
      if res.is_ok(){

         let p:Person=res.unwrap();
         p.show();
         }else{
        println!("Sorry ! we could not pass json");
     }
            i=i+1;

 } 
}




























/*fn main(){
    let mut file = File::open("text.json").unwrap();
    let  data = String::new();
    file.read_to_end(data).unwrap();
    let res=serde_json::from_str(&data);
    if res.is_ok(){
        let p:Person=res.unwrap();
        println!("{}",p.first_name);
        println!("{}",p.age);
    }
    else{
        println!("cannot pass the value");
    }

//     for i in data.iter(){
//     println!("{}",i);
// }
/*let s = match str::from_utf8(&data) {
    Ok(v) => v,
    Err(e) => panic!("Invalid UTF-8 sequence: {}", e),
};*/
//println!("result: {}", s);


/*let str1=String::from(s);*/
//println!("result: {}", str1);



//let  main_vec= str1.lines().map(|s| s.trim().split('}').map(String::from).collect::<Vec<String>>()).collect::<Vec<Vec<String>>>();

/*for item in (main_vec).iter(){
    println!("{:?}",item);
    let str24:String=item;
    let res=serde_json::from_str(str24);
    if res.is_ok(){
        let p:Person=res.unwrap();
        println!("{}",p.first_name);
        println!("{}",p.age);
    }
    else{
        println!("cannot pass the value");
    }*/

    /*let strings = s.split("},");
    println!("{}",strings);
    for x in strings {
        //println!("{}", x);
        let res=serde_json::from_str(x);
    if res.is_ok(){
        let p:Person=res.unwrap();
         println!("{}",p.first_name);
        println!("{}",p.age);
        println!("-----------------------");
    }
    else{
        println!("cannot pass the value");
    }*/
      }*/

关于json - 如何在Rust中搜索和解析任意长的JSON文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59231174/

相关文章:

json - 如何用 R 检索 json 的 "values"?

rust - 如何在 Rust 中通过宏生成 const 数组?

vector - 使用不可复制的移动值 [E0382] [E0277]

string - 函数不想使用函数参数返回字符串切片

java - 如何使用 GSON 解析 JSON WHen 对象是 JSONObject 或 JSONArray

javascript - 两个不同的JSON源,不同时间更新;在 ng-Repeat 列表中使用结果

javascript - 如果 css() == X,否则,不工作,表单不工作

javascript - 文本响应需要 Double JSON.parse() 的实例

rust - 结构可以在 Rust 中实现两个具有冲突方法名称的特征吗?

rust - 为什么 Rust 的方法文档使用单独的构建器结构作为示例?