我有一个复杂的JSON文件,我只想从中提取一个值.我可以定义所有的struct,并在所有的struct上推导出Deserialize,但我只想编写一些手动代码来提取这个值.坦率地说,这Serde documentation人让我很困惑.

我的JSON内容具有以下布局:

{
  "data": [
    {
      "hostname": "a hostname"
    }
  ]
}

我通过进入data来寻找导航到的值,然后取数组的第一个元素,然后取hostname.

在哈斯克尔,我会这样做:

newtype Host = Host Text

instance FromJSON Host where
    parseJSON (Object o) = (return . Host) <=< (.: "hostname") <=< (fmap (!! 0) . parseJSON) <=< (.: "data") $ o
    parseJSON _ = mzero

Serde的类似功能是什么?

推荐答案

serde_json为泛型JSON值提供了serde_json::Value个类型:

use serde_json::Value;

// input variable
let input: &str = "{...}";

// parse into generic JSON value
let root: Value = serde_json::from_str(input)?;

// access element using .get()
let hostname: Option<&str> = root.get("data")
    .and_then(|value| value.get(0))
    .and_then(|value| value.get("hostname"))
    .and_then(|value| value.as_str());

// hostname is Some(string_value) if .data[0].hostname is a string,
// and None if it was not found
println!("hostname = {:?}", hostname); // = Some("a hostname")

(full playground example)

Rust相关问答推荐

将JSON密钥转换为Polars DataFrame

如何将`Join_all``Vec<;Result<;Vec<;Foo&>;,Anywhere::Error&>;`合并到`Result<;Vec<;Foo&>;,Anywhere::Error&>;`

为什么std repeat trait绑定在impl块和关联函数之间?

如何防止Cargo 单据和Cargo 出口发布( crate )项目

无法实现整型类型的泛型FN

关于使用平面图功能的borrow 判断器的问题

如何轮询 Pin>?

为相同特征的特征对象使用 move 方法实现特征

确保参数是编译时定义的字符串文字

如何将 struct 数组放置在另一个 struct 的末尾而不进行内存分段

Rust:为什么 Pin 必须持有指针?

Rust typestate 模式:实现多个状态?

由特征键控的不同 struct 的集合

如何从 x86_64 Mac 构建 M1 Mac?

内部值发生变化时 Rc 的行为

类型判断模式匹配panic

没有分号的返回表达式的性能是否比使用返回更好?在Rust ?

是否有适当的方法在参考 1D 中转换 2D 数组

隐式类型闭包的错误生命周期推断

为什么这个值在上次使用后没有下降?