【问题标题】:"key must be a string" when deserializing a JSON string with Serde使用 Serde 反序列化 JSON 字符串时,“key must be a string”
【发布时间】:2020-08-19 17:29:53
【问题描述】:

我正在构建一个使用 Rust 进行复杂计算的 React 应用程序。在这种情况下,我将一个 JSON 格式的字符串从 React 应用程序传递给 Rust:

{
  {'clientid': 1, 'category': 'Category #1', 'subcategory': 'Subcategory #1', 'cost': 1000.00},
  {'clientid': 1, 'category': 'Category #1', 'subcategory': 'Subcategory #2', 'cost': 2000.00}
}

我试图弄清楚如何将 Rust 中的字符串反序列化为定义为的结构数组:

#[derive(Serialize, Deserialize, Debug)]
struct ClientBudget {
    clientid: u32,
    category: String,
    subcategory: String,
    cost: f32,
}

我试过了:

let deserialized: ClientBudget = serde_json::from_str(&some_json).unwrap();

但这会引起恐慌:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error("key must be a string"

如何让 Rust/serde 处理这个 JSON 字符串?

【问题讨论】:

  • 如果您传递的字符串与您在问题顶部显示的完全一样,则错误是因为它不是有效的 JSON(使用 ' 而不是 "使用[] 作为数组)。将来,请在您的问题中包含一个 minimal reproducible example 来证明问题,最好是一个 Rust playground 链接。
  • 您可以使用许多在线工具来验证您的 JSON 字符串。 jsonlint.com 是我在快速搜索中找到的第一个。您还可以在浏览器 JSON 控制台中使用 JSON.parse()
  • 请不要在收到答复后更改您的问题。鼓励您改为打开一个新问题(在询问之前查找任何重复问题)。
  • 抱歉,我认为这是我在阅读有关关闭状态的信息后应该做的。感谢您的帮助。

标签: json rust serde


【解决方案1】:

您的 JSON 格式错误。如果你想要一个列表,你必须使用[] 而不是{}。您还需要反序列化 Vec 的对象:

use serde::{Deserialize, Serialize}; // 1.0.114

#[derive(Serialize, Deserialize, Debug)]
struct ClientBudget {
    clientid: u32,
    category: String,
    subcategory: String,
    cost: f32,
}

fn main() {
    let data = r#"
[
    {"clientid": 1, "category": "Category #1", "subcategory": "Subcategory #1", "cost": 1000.00},
    {"clientid": 1, "category": "Category #1", "subcategory": "Subcategory #2", "cost": 2000.00}
]
    "#;
    let deserialized: Vec<ClientBudget> = serde_json::from_str(data).unwrap();

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

Playground

【讨论】:

  • 您的示例/解决方案显示了一个 Rust Vec 对象。这不是从 React 传递给 Rust 的内容。我从 React 得到的是我的示例中显示的表单,它是正确的 JSON。
  • 这是正确的 JSON — [需要引用]。
  • 我很抱歉。我错了。对于 JSON 格式的数据,我一直使用示例中显示的格式。在检查我的反应输出并使用在线 JSON 验证器后,我现在发现我错了。不知道什么时候事情发生了变化,或者我过去是如何摆脱这种结构的,但我现在看到了我的方式的错误。谢谢和道歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多