【问题标题】:Parsing a JSON into a Map in rust将 JSON 解析为 rust 中的 Map
【发布时间】:2019-07-30 21:12:03
【问题描述】:

我是 Rust 的初学者,只是在解析 JSON 文件时遇到了问题。我尝试使用 serde_json 来完成任务。我知道如何将 ASCII 文件解析为字符串,以及如何将其内容解析为 Value,但我需要 Map<String, Value> 来迭代 KVP。我没有走得太远,因为我偶然发现了一个参考错误。我尝试的方法如下:

use std::fs;
use std::error::Error;
use serde_json::{Value, Map};

pub struct ConfigSerde;

impl ConfigSerde {
    pub fn read_config(path: &str) -> Result<Map<String, Value>, Box<Error>> {
        let config = fs::read_to_string(path)?;
        let parsed: Value = serde_json::from_str(&config)?;
        let obj: Map<String, Value> = parsed.as_object().unwrap();
        Ok(obj)
    }
}

一旦我尝试运行这段代码,编译器就会抛出以下错误:

error[E0308]: mismatched types
  --> src/config/serde.rs:11:39
   |
11 |         let obj: Map<String, Value> = parsed.as_object().unwrap();
   |                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `serde_json::map::Map`, found reference
   |
   = note: expected type `serde_json::map::Map<std::string::String, serde_json::value::Value>`
              found type `&serde_json::map::Map<std::string::String, serde_json::value::Value>`

如何将 JSON 解析为 rust 中的 Map?我愿意使用其他 crate,尽管 serde_json 是首选,因为它似乎是最强大的。

【问题讨论】:

    标签: rust serde-json


    【解决方案1】:

    由于as_object 返回一个引用并且您需要一个拥有的值,因此您需要克隆地图。幸运的是 Map 提供了一个 Clone 实现,所以你可以这样做:

    let obj: Map<String, Value> = parsed.as_object().unwrap().clone();
    

    【讨论】:

    • 感谢您的快速回复。克隆解决了这个问题。我会尽快接受的。
    • 同样,您可以考虑将read_config 函数签名更新为pub fn read_config(path: &amp;str) -&gt; Result&lt;Map&lt;String, Value&gt;, Box&lt;dyn Error&gt;&gt; 以满足编译器的警告消息:warning: trait objects without an explicit 'dyn' are deprecated
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2020-05-20
    • 2013-11-30
    相关资源
    最近更新 更多