使用Serde反序列化JSON字符串时,“密钥必须是字符串”

问题描述

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

{
  {'clientid': 1,'category': 'Category #1','subcategory': 'Subcategory #1','cost': 1000.00},{'clientid': 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格式错误。如果需要列表,则必须使用[]而不是{}。您还需要反序列化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,"subcategory": "Subcategory #2","cost": 2000.00}
]
    "#;
    let deserialized: Vec<ClientBudget> = serde_json::from_str(data).unwrap();

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

Playground