Несоответствующие типы при попытке разобрать JSON из curl с serde_json

У меня есть вывод JSON из API для открытого WIFI, который я хочу поместить в базу данных. Данные в этой форме.

Я уже получил информацию через 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 `()`

Не могли бы вы дать мне пример того, как обрабатывать данные, чтобы поместить их в базу данных?

1 ответ

Я уже получил информацию через curl:

Нет, ты не сделал. Вы загрузили его, но затем записали в стандартный формат:

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

Что ты назвал json код ответа HTTP. Это значение типа u32:

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

Получение данных в векторе описано в документации curl. Компилятор сказал вам, что у вас были неправильные типы; Вы должны прочитать и понять это, а затем выяснить, почему типы неправильны:

   = 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() {}
Другие вопросы по тегам