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

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)
    }
}

我try 运行此代码后,编译器抛出以下错误:

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解析为Map英寸的rust?虽然serde_json是首选,但我愿意使用其他 crate ,因为它似乎是所有 crate 中最 Solidity 的.

推荐答案

由于as_object返回一个引用,并且需要一个拥有的值,因此需要克隆映射.幸运的是,Map提供了Clone实现,因此您可以执行以下操作:

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

Rust相关问答推荐

使用nom将任何空白、制表符、白线等序列替换为单个空白

如何优化小型固定大小数组中的搜索?

为什么我的梅森素数代码的指数越大,速度就越快?

MacOS(AARCH64)上Ghidra中的二进制补丁导致进程终止

限制未使用的泛型导致编译错误

闭包不会发送,即使它只捕获发送变量

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

如果死 struct 实现了/派生了一些特征,为什么Rust会停止检测它们?

不能在Rust中使用OpenGL绘制三角形

使用 pyo3 将 Rust 转换为 Python 自定义类型

为什么 Rust 需要可变引用的显式生命周期而不是常规引用?

write_buffer 不写入缓冲区而是输出零 WGPU

Rust中如何实现一个与Sized相反的负特性(Unsized)

是否可以通过可变引用推进可变切片?

如何使用泛型满足 tokio 异步任务中的生命周期界限

以 `static` 为前缀的闭包是什么意思?我什么时候使用它?

为什么我可以同时传递可变和不可变引用?

判断 is_ok 后重用结果

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

如果我立即等待,为什么 `tokio::spawn` 需要一个 `'static` 生命周期?