mysql 无法找到生 rust 错误“Error(“EOF while parsing an object”的解决方案,行:1,第1栏)”

wn9m85ua  于 2023-03-28  发布在  Mysql
关注(0)|答案(2)|浏览(197)
use std::fs::File;
use std::io::{prelude::*, BufReader};
use serde_json::{Value};

use mysql::*;
use mysql::prelude::*;

struct Show {
    title: String,
    show_poster: String,
    show_url: String,
}

fn main() {
    // Open and read the file lines
    let path = r"C:\Users\egete\Desktop\projects\cdeneme\rust\mysqljson\src\info.json";
    let file = File::open(path).expect("Unable to read file");
    let reader = BufReader::new(file);
    let lines: Vec<String> = reader.lines().map(|l| l.expect("Could not parse line")).collect();

    // Connect to your my-sql database
    let url = Opts::from_url("mysql://root:Egetelli99@localhost:3306/jsonmysql").unwrap();
    let pool = Pool::new(url).unwrap();
    let mut conn = pool.get_conn().unwrap();

    // Loop through the lines
    for line in lines {

        // Parse the line into a JSON object serde_json::Value
        let v: Value = serde_json::from_str(&line).expect("Unable to parse");

        // Since we want to save the streaming services of the said show, we need to 
        // loop an array inside the JSON file.
        let l = v["watchAvailability"][0]["directUrls"].as_array().unwrap().len();
        for n in 0..l {
            let streaming_url = v["watchAvailability"][0]["directUrls"][n].as_str().clone();
            match streaming_url {
                Some(url) => {
                    // Display the streaming url.  I have to do this to remove the Some(url) warning. 
                    // Unused variables in Rust emits warnings
                    println!("{:?}", url);

                    // Create a vector (array of object).  
                    // This provides you the ability to process multiple objects upon saving
                    let shows = vec![
                        Show { 
                            title: v["title"].as_str().as_deref().unwrap_or("Error").to_string(),
                            show_poster: v["posterPath"].as_str().as_deref().unwrap_or("Error").to_string(),
                            show_url: v["watchAvailability"][0]["directUrls"][n].as_str().as_deref().unwrap_or("Error").to_string(),
                        },
                    ];  
                    //Execute an insert query
                    conn.exec_batch(
                        r"INSERT INTO `shows` (`title`, `show_poster`, `show_url`)
                        VALUES (:title, :show_poster, :show_url)",
                    shows.iter().map(|s| params! {
                        "title" => s.title.clone(),
                        "show_poster" => s.show_poster.clone(),
                        "show_url" => s.show_url.clone(),
                        })
                    ).unwrap_err();
                },
                _ => println!("Error"),
            }
        }

    }
}

这是什么问题呢?这个错误显示:线程“main”在“无法解析:Error(“EOF while parsing an object”,line:1,column:1)',src\main.rs:30:52注:使用RUST_BACKTRACE=1环境变量运行以显示回溯错误:进程未成功退出:target\debug\mysqljson.exe(退出代码:101)

zkure5ic

zkure5ic1#

你正在阅读一个文件,但是serde无法弄清楚如何序列化文件中的数据,如果不完全匹配json格式。
此外,您可能会注意到您正在使用的操作系统,因为由于\r\n\n的差异,阅读行可能会使您摔倒。

qcuzuvrc

qcuzuvrc2#

我找到了解决方案。在我的情况下,文件末尾有一个空行(在最后一行之后)。我根据“\n”换行符拆分整个文件。这样最后一项是空行,serde试图反序列化空行。希望它有帮助。:)

相关问题