如何在 Rust 中将字符串转换为有效的 JSON

3

我是一名新手 Rust 程序员,有 JavaScript 背景。我遇到了一个小问题,“如何在 Rust 中执行 JSON.parse?”

我有一个 &str 类型的字符串"{\"first\":\"one\",\"second\":\"two\"}",我想要一个对象{first:"one",second:"two"}

我已经搜索了多个链接,但仍然卡在这一点上。

我尝试了以下方法 -

  1. let mut object: Value = serde_json::from_str(abc).unwrap();

    错误 - 特质绑定 api::Value: Deserialize<'_> 未被满足

  2. 将其转换为字符串和选项,使用 Some(string.as_deref())

  3. (Rust- JSON) 如何在 Rust 中将 &str 转换为 JSON 响应?

  4. https://users.rust-lang.org/t/how-to-convert-a-string-type-to-a-json-object/72142


1
api::Value是什么?你的尝试在哪里(实际代码,而不仅仅是“我尝试过这个”,因为你提供的所有链接都有解决方案)?你可以查看[mre]和[ask]以获取更多改进问题的提示。 - cafce25
2
请提供您的方法代码,确保1)可以简单地运行。 - Finomnis
可能 api::Value 不是你想要的,也许应该使用 serde_json::Value。也许你的 use 语句不正确? - Finomnis
2个回答

2

解析 JSON 字符串有许多方法,但通常确实涉及 serdeserde_json

如果您只想要一个简单的 serde_json::Value 对象,则可以使用以下代码:

fn main() {
    let json_str = r#"{"first":"one","second":"two"}"#;
    let json_val: serde_json::Value = serde_json::from_str(json_str).unwrap();

    println!("{:#?}", json_val);
}

Object {
    "first": String("one"),
    "second": String("two"),
}

如果你想要更复杂的东西,比如一个实际包含firstsecond成员的结构体,你可以将其解析为一个serde派生的结构体:
use serde::Deserialize;

#[derive(Debug, Deserialize)]
struct MyValue {
    first: String,
    second: String,
}

fn main() {
    let json_str = r#"{"first":"one","second":"two"}"#;
    let my_value: MyValue = serde_json::from_str(json_str).unwrap();

    println!("{:#?}", my_value);
}

MyValue {
    first: "one",
    second: "two",
}

如果您不想使用结构体或者Value,而是想要一个简单的HashMap<String, String>,请按照以下步骤操作:

use std::collections::HashMap;

fn main() {
    let json_str = r#"{"first":"one","second":"two"}"#;
    let my_dict: HashMap<String, String> = serde_json::from_str(json_str).unwrap();

    println!("{:#?}", my_dict);
}

{
    "first": "one",
    "second": "two",
}

serde_json::from_str 的可能性是无穷的。只需弄清楚您想要使用数据执行哪些任务,然后选择适当的数据类型即可;)


1
JSONSchema parser macros 可以帮助创建必要的结构,如果您有 JSONSchema。如果您拥有示例数据,则可以使用 https://www.jsonschema.net/ 等网站从示例数据创建 JSONSchema。请注意保留 HTML 标签,并使翻译内容更加通俗易懂。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接