Невозможно десериализовать с помощью Serde: оператор `?` Можно использовать только в функции, которая возвращает `Result`

Я пытаюсь десериализовать строку json в структуру, но у меня проблемы с тем, чтобы заставить ее работать. Все, что я хочу сделать, это распечатать статус и / или результат первого соответствия run["meta"]["username"] против данного имени пользователя.

Однако, несмотря на то, что я последовал данному примеру, я не могу заставить его работать. Теперь я предпочел бы сделать это с нетипизированными значениями, так как я не собираюсь хранить значения, но когда я делаю это, я не могу легко перебрать исходный массив, делая runs.as_array().iter() кажется, возвращает Vec с одним String элемент, содержащий всю строку json, следовательно, необходимо добавить типизацию, но теперь это тоже не работает.

Текущая проблема, которую я получаю, заключается в следующем:

error[E0277]: the `?` operator can only be used in a function that returns `Result` (or another type that implements `std::ops::Try`)
  --> src/main.rs:60:30
   |
60 |               let runs: Runs = serde_json::from_str(get_runs(&mut client,
   |  ______________________________^
61 | |                                 &settings["pipeline_id"]).as_str())?;
   | |____________________________________________________________________^ cannot use the `?` operator in a function that returns `()`
   |
   = help: the trait `std::ops::Try` is not implemented for `()`
   = note: required by `std::ops::Try::from_error`

Что не имеет смысла, потому что если вы удалите ? потом жалуется, что runs ожидал Runs и вместо этого получил Result, так что я очень смущен, как он может жаловаться, что он возвращает Result а потом жаловаться, что он возвращает ()?

Очевидно, я что-то упускаю и просто не вижу этого.

Вторая проблема заключается в том, что я не могу использовать .iter() на:

struct Runs(Vec<Run>);

Я знаю, что это упакованный Vec, но не должен ли он делегировать или что-то автоматически? Потому что я не могу использовать псевдоним типа или просто сделать:

let runs: Vec<Run> = 

потому что мне нужно иметь:

# [производное (отладка, сериализация, десериализация)]

перед этим, чтобы позволить ему работать с ser-rs.

Итак, как мне решить две проблемы, которые позволят мне получить необходимые данные от json?

Вот минимальный (для ржавчины) пример:

extern crate serde_json;

#[macro_use]
extern crate serde_derive;

use std::collections::HashMap;


use serde_json::{Value, Error};


#[derive(Debug,Serialize, Deserialize)]
struct Runs(Vec<Run>);

#[derive(Debug,Serialize, Deserialize)]
struct Meta {
    username: String
}

#[derive(Debug,Serialize, Deserialize)]
struct User {
    meta: Meta,
}

#[derive(Debug,Serialize, Deserialize)]
struct Run {
    status: String,
    result: String
    user: User,
}

fn main() {

    let data = r#"
    [
        {
            "id": "577a4dbc3ec144923a02b6f9",
            "url": "https://app.wercker.com/api/v3/runs/577a4dbc3ec144923a02b6f9",
            "branch": "master",
            "commitHash": "cd74a9994712960f19b4b563491f860f98fa7bb5",
            "createdAt": "2016-07-04T11:51:24.851Z",
            "finishedAt": "2016-07-04T11:51:34.284Z",
            "message": "My custom message!",
            "progress": 57,
            "result": "aborted",
            "startedAt": "2016-07-04T11:51:25.996Z",
            "status": "finished",
            "user": {
              "meta": {
                "werckerEmployee": true,
                "username": "tonnu"
              },
              "userId": "549101f36b3ba8733d88ce96",
              "avatar": {
                "gravatar": "bb95c388b227da2ce2f33c0811478095"
              },
              "name": "Toon",
              "type": "wercker"
            },
            "pipeline": {
              "id": "5751377e7e1bd5f17f050bc4",
              "url": "https://app.wercker.com/api/v3/pipelines/5751377e7e1bd5f17f050bc4",
              "createdAt": "2016-06-03T07:53:34.294Z",
              "name": "initial-build",
              "permissions": "public",
              "pipelineName": "initial-build",
              "setScmProviderStatus": true,
              "type": "git"
            }
        }
    ]"#;
    let runs: Runs = serde_json::from_str(data).as_str()?;
    for run in runs.iter() {
        println!("{}","------------");
        println!("{:?}",run)

    }
}

0 ответов

Другие вопросы по тегам