2017-12-02 4 views
0

私はデータベースに入れたいオープンWIFIのAPIからJSON出力を得ました。データはthis formです。serde_jsonでcurlからJSONを解析しようとするとタイプが一致しない

私はすでにcurlを介して情報を得ました:

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 `()` 

はあなたが私に与えてもらえ:私は常にエラーを取得

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() {} 

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を使用しようとしましたデータをデータベースに取り込むためにデータを処理する方法の例?

答えて

0

I already got the information via curl:

いいえ、あなたはしませんでした。あなたはそれをダウンロードしたが、その後、標準出力にそれを書いた:

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

何がjsonと呼ばれていることHTTP response codeです。これは、タイプu32の値である:

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

ベクターにデータを取得described in the curl documentationです。コンパイラは、あなたにタイプが間違っているとと伝えました。あなたはタイプが間違っている理由を把握、その後、それを読んで理解しておく必要があります

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

また、あなたから読んでserde_json::Valueを持っていないので、あなたがfrom_valueを使用することはできません。

2番目のエラーは、関数が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() {} 
を返す、停止
関連する問題