serde_json :: from_str错误其中string来自file

时间:2016-09-02 03:19:04

标签: json parsing generics rust serde

extern crate serde_json;

use serde_json::Value;

use std::fs::File;
use std::io::prelude::*;

fn main() {
    let filepath = "./map/test/anhui.txt";
    match File::open(filepath) {
        Err(why) => println!("Open file failed : {:?}", why.kind()),
        Ok(mut file) => {
            let mut content: String = String::new();
            file.read_to_string(&mut content);
            println!("{}", &mut content);
            serde_json::from_str(&mut content);
        }
    }
}

错误信息:

error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [--explain E0282]
  --> src/main.rs:16:17
   |>
16 |>                 serde_json::from_str(&mut content);
   |>                 ^^^^^^^^^^^^^^^^^^^^

1 个答案:

答案 0 :(得分:3)

要修复它,您需要告诉编译器您期望serde_json::from_str的结果是什么类型。所以你可以改变这一行

serde_json::from_str(&mut content);

serde_json::from_str::<Value>(&mut content);

您需要指定类型的原因是因为serde_json::from_str是一个通用函数,需要将类型实例化为具体函数。通常,rustc会处理它,并推断出你想要使用的类型,但是在这种情况下,没有足够的信息让编译器为你推断它,因为类型只在函数的结果中被引用而结果是永远的在给定的代码中使用。

您可能还想使用from_str表达式的结果,否则函数调用不会执行任何操作。如果在使用let绑定时指定类型,编译器将能够推断出类型,如下所示:

let result: Value = serde_json::from_str(&mut content);