2015-11-05 2 views
0

Следующий код возьмите папку json-файлов (сохраненных с отступом), откройте ее, получите контент и сериализуйте в json и напишите в файл нового файла. Такая же задача кода в python работает, поэтому это не данные. Но ржавчина версия вы видите здесь:Чтение файла json и запись без отступа

extern crate rustc_serialize; 
use rustc_serialize::json; 
use std::io::Read; 
use std::fs::read_dir; 
use std::fs::File; 
use std::io::Write; 
use std::io; 
use std::str; 


fn write_data(filepath: &str, data: json::Json) -> io::Result<()> { 

    let mut ofile = try!(File::create(filepath)); 
    let encoded: String = json::encode(&data).unwrap(); 
    try!(ofile.write(encoded.as_bytes())); 
    Ok(()) 
} 


fn main() { 

    let root = "/Users/bling/github/data/".to_string(); 
    let folder_path = root + &"texts"; 
    let paths = read_dir(folder_path).unwrap(); 

    for path in paths { 
     let input_filename = format!("{}", path.unwrap().path().display()); 
     let output_filename = str::replace(&input_filename, "texts", "texts2"); 

     let mut data = String::new(); 
     let mut f = File::open(input_filename).unwrap(); 
     f.read_to_string(&mut data).unwrap(); 
     let json = json::Json::from_str(&data).unwrap(); 

     write_data(&output_filename, json).unwrap(); 
    } 
} 

У вас есть место на ошибку в моем коде уже или я получил некоторые языковые понятия неправильно. Неправильно используется грузик-сериализованный груз. В конце он работает не так, как ожидалось, - чтобы превзойти питона.

± % cargo run --release --verbose                                    
     Fresh rustc-serialize v0.3.16 
     Fresh fileprocessing v0.1.0 (file:///Users/bling/github/rust/fileprocessing) 
    Running `target/release/fileprocessing` 
thread '<main>' panicked at 'called `Result::unwrap()` on an `Err` value: SyntaxError("unescaped control character in string", 759, 55)', ../src/libcore/result.rs:736 
Process didn't exit successfully: `target/release/fileprocessing` (exit code: 101) 

Почему это ошибка, так это моя сериализация json, сделанная неправильно?
Могу ли я получить объект, на котором он не работает? Как насчет кодировки?

... является правильным кодом или есть что-то явно неправильное с некоторым опытом?

+0

Что вы спрашиваете? Вы спрашиваете, почему он медленнее, чем Python («* превосходит python *»)? Вы спрашиваете, почему вы получаете сообщение об ошибке? * SyntaxError ("unescaped control character in string", 759, 55) * - Посмотрел ли вы файл в этой позиции, чтобы узнать, почему у вас есть контрольный символ? * это не данные * - более чем возможно, что один из Rust или Python более строг относительно стандарта JSON. – Shepmaster

+0

Извините, не было так очевидно, как думал, и добавил вопрос до конца. Благодарю. – rebeling

+0

Проблема в том, что один из ваших входных файлов содержит недопустимый JSON. Вам нужно выяснить, какой файл (распечатать имя файла?), А затем посмотреть строку 759, колонку 55, чтобы выяснить, что это такое. Об этом сообщает сообщение об ошибке. – Shepmaster

ответ

1

Дикая догадка: если один и тот же входной файл может быть проанализирован другими анализаторами JSON (например, на Python), вы можете столкнуться с ошибкой rustc-serialize, которая была исправлена ​​в https://github.com/rust-lang-nursery/rustc-serialize/pull/142. Попробуйте обновить?

Смежные вопросы