2017-12-02 137 views
0

我從打開的WIFI的API獲取了JSON輸出,我想將其放入數據庫。數據在this form嘗試使用serde_json從curl中解析JSON時出現不匹配的類型

我已經通過curl得到的信息:

let mut easy = Easy::new(); 
easy.url("https://map.freifunk-rhein-neckar.de/data/nodes.json") 
    .unwrap(); 
easy.write_function(|data| Ok(stdout().write(data).unwrap())) 
    .unwrap(); 
easy.perform().unwrap(); 

let mut json = easy.response_code().unwrap(); 

我試圖用serde_json:

extern crate curl; 
extern crate serde; 
extern crate serde_json; 

use std::io::{stdout, Write}; 
use curl::easy::Easy; 
#[macro_use] 
extern crate serde_derive; 

use serde_json::Error; 

#[derive(Serialize, Deserialize)] 
struct Freifunk { 
    timestamp: u32, 
    version: i8, 
    nodes: u32, 
} 

fn json_to_rust() -> Result<(), Error> { 
    //Json von Homepage "Auslesen/Downloaden" 
    let mut easy = Easy::new(); 
    easy.url("https://map.freifunk-rhein-neckar.de/data/nodes.json") 
     .unwrap(); 
    easy.write_function(|data| Ok(stdout().write(data).unwrap())) 
     .unwrap(); 
    easy.perform().unwrap(); 

    let mut json = easy.response_code().unwrap(); 

    let to_string: Freifunk = serde_json::from_value(json)?; 
} 

fn main() {} 

我總是得到一個錯誤:

error[E0308]: mismatched types 
    --> src/main.rs:29:54 
    | 
29 |  let to_string: Freifunk = serde_json::from_value(json)?; 
    |              ^^^^ expected enum `serde_json::Value`, found u32 
    | 
    = note: expected type `serde_json::Value` 
       found type `u32` 

error[E0308]: mismatched types 
    --> src/main.rs:18:40 
    | 
18 | fn json_to_rust() -> Result<(), Error> { 
    | ________________________________________^ 
19 | |  //Json von Homepage "Auslesen/Downloaden" 
20 | |  let mut easy = Easy::new(); 
21 | |  easy.url("https://map.freifunk-rhein-neckar.de/data/nodes.json") 
... | 
29 | |  let to_string: Freifunk = serde_json::from_value(json)?; 
30 | | } 
    | |_^ expected enum `std::result::Result`, found() 
    | 
    = note: expected type `std::result::Result<(), serde_json::Error>` 
       found type `()` 

可不可以給我一個如何處理數據以將其存入數據庫的示例?

回答

0

I already got the information via curl:

不,你沒有。你下載了它,但隨後寫到標準輸出:

easy.write_function(|data| Ok(stdout().write(data).unwrap())) 

什麼你都呼籲jsonHTTP response code。這是u32類型的值:

let mut json = easy.response_code().unwrap(); 

獲取數據到載體是described in the curl documentation。編譯器告訴你你有錯誤的類型;你需要閱讀和理解它,然後找出原因的類型是錯誤的:

= note: expected type `serde_json::Value` 
       found type `u32` 

此外,您不能使用from_value,因爲你沒有一個serde_json::Value從讀做。

你的第二個錯誤是因爲你聲明你的函數返回一個Result,但是你不會在函數結束時返回這樣的結果。你剛纔...停止,它返回一個()

= note: expected type `std::result::Result<(), serde_json::Error>` 
       found type `()` 

extern crate curl; 
extern crate serde; 
#[macro_use] 
extern crate serde_derive; 
extern crate serde_json; 

use curl::easy::Easy; 
use serde_json::Error; 

#[derive(Debug, Serialize, Deserialize)] 
struct Freifunk { 
    timestamp: u32, 
    version: i8, 
    nodes: u32, 
} 

fn json_to_rust() -> Result<(), Error> { 
    let mut json = Vec::new(); 

    let mut easy = Easy::new(); 
    easy.url("https://map.freifunk-rhein-neckar.de/data/nodes.json") 
     .unwrap(); 
    { 
     let mut transfer = easy.transfer(); 
     transfer 
      .write_function(|data| { 
       json.extend_from_slice(data); 
       Ok(data.len()) 
      }) 
      .unwrap(); 
     transfer.perform().unwrap(); 
    } 

    assert_eq!(200, easy.response_code().unwrap()); 

    let freifunk: Freifunk = serde_json::from_slice(&json)?; 

    println!("{:?}", freifunk); 

    Ok(()) 
} 

fn main() {} 
相關問題