Ржавчина Пытается загрузить файл JSON

#json #rust

Вопрос:

У меня возникли проблемы при попытке заставить Rust загрузить файл JSON. Компиляция выполняется, но во время выполнения возникает ошибка, и она завершается.Кроме того, код ошибки не найден.

Исходный код является

 use iced::{
    executor, Align, Application, Clipboard, Column, Command, Element,
    Length, Row, Settings, Text,
};

use serde::{Serialize, Deserialize};
use std::collections::HashMap;
use std::fs::File;
use std::io::BufReader;

#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
struct Tasks {
    task: Task
}

#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
struct Task {
    deadline: String,
    details: String,
    user: HashMap<String, String>
}


struct GUI;

impl Application for GUI {
    type Executor = executor::Defau<
    type Message = ();
    type Flags = ();

    fn new(_flags: ()) -> (GUI, Command<Self::Message>) {
        (GUI, Command::none())
    }

    /// Sets the window title.
    fn title(amp;self) -> String {
        String::from("rust_gui_test")
    }

    fn update(
        amp;mut self,
        _message: Self::Message,
        _clipboard: amp;mut Clipboard,
    ) -> Command<Self::Message> {
        Command::none()
    }

    fn view(amp;mut self) -> Element<Self::Message> {
        
        let file = File::open("task.json").unwrap();
        let reader = BufReader::new(file);
        let deserialized: Tasks = serde_json::from_reader(reader).unwrap();
        let serialized = deserialized.task.deadline;
        let json_data = serde_json::to_string(amp;serialized).unwrap(); //amp;alloc::String::String
        let textarea = Text::new(json_data).size(60);


        // prepare column
        Column::new()
        .push(textarea)
        .push(
            Row::new()
                .spacing(10),
        )
        .spacing(10)
        .padding(10)
        .width(Length::Fill)
        .height(Length::Fill)
        .align_items(Align::Center)
        .into()
    }
   
}

fn main() -> iced::Result {
    GUI::run(Settings::default())
}
 

тестовый json-это

 {
    "task1": {
      "deadline": "2000-01-01 00:00:00",
      "details": "Folder/Path",
      "target":{
        "alice": {
          "progress": 0,
          "comment":"no"
        },
        "Bob": {
          "progress": 1,
          "comment":"ok"
        }
      }
    },
    "task2": {
      "deadline": "2222-01-01 00:00:00",
      "details": "Folder/Path",
      "target":{
        "alice": {
          "progress": 0,
          "comment":"no"
        },
        "Carol": {
          "progress": 1,
          "comment":"ok"
        }
      }
    }
  }
 

Ошибка в том, что

 Running `targetdebugprogress_app.exe`
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error("missing field `Task`", line: 30, column: 3)', srcmain.rs:57:67
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: process didn't exit successfully: `targetdebugprogress_app.exe` (exit code: 0xc0000005, STATUS_ACCESS_VIOLATION)
 

Как я могу получить все цели json, избегая при этом ошибок?
Изменение RUST_BACKTRACE на 1 приведет только к созданию чего-то вроде записи, и ошибка не изменится.

Комментарии:

1. Вы, вероятно, хотите декодировать в HashMap<String, Task>

2. Формат тестового json не соответствует структуре кода: task1 и task2 не может быть сопоставлен с ключом задачи в коде. Если JSON генерируется вашим кодом, я предлагаю изменить его, чтобы добавить id файл, а затем task1 и task2 может быть объединен с ключом task