简体   繁体   English

使用 Serde 反序列化 JSON 字符串时,“key must be a string”

[英]“key must be a string” when deserializing a JSON string with Serde

I'm building a React app utilizing Rust for complex computations.我正在构建一个使用 Rust 进行复杂计算的 React 应用程序。 In this case I'm passing a JSON formatted string from the React app to Rust:在这种情况下,我将一个 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}
}

I'm trying to figure out how to deserialze string In Rust into an array of structs defined as:我试图弄清楚如何将 Rust 中的字符串反序列化为定义为的结构数组:

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

I tried:我试过了:

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

But this causes a panic:但这会引起恐慌:

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

How do I get Rust/serde to process this JSON string?如何让 Rust/serde 处理这个 JSON 字符串?

Your JSON is badly formatted.您的 JSON 格式错误。 If you want a list, you must use [] not {} .如果你想要一个列表,你必须使用[]而不是{} You also need to deserialize a Vec of objects:您还需要反序列化对象的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 操场

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM