首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锈蚀中的JsonNode

锈蚀中的JsonNode
EN

Stack Overflow用户
提问于 2014-11-05 13:53:15
回答 1查看 217关注 0票数 0

我在Rust http://doc.rust-lang.org/serialize/json/的标准JSON库中运行,无法找出它中的节点代表什么。在Java中是JsonNode。铁锈里有什么?例如,如何在Rust中传递JsonNode类型的参数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-05 15:09:01

铁锈的Json枚举定义了JSON的"DOM“。例如,这个JSON对象:

代码语言:javascript
复制
{ "array": [1, 2, 3], "submap": { "bool": true, "string": "abcde" } }

用“锈”表示:

代码语言:javascript
复制
macro_rules! tree_map {
    ($($k:expr -> $v:expr),*) => ({
        let mut r = ::std::collections::TreeMap::new();
        $(r.insert($k, $v);)*
        r
    })
}

let data = json::Object(tree_map! {
    "array".to_string() -> json::List(vec![json::U64(1), json::U64(2), json::U64(3)]),
    "submap".to_string() -> json::Object(tree_map! {
        "bool".to_string() -> json::Boolean(true),
        "string".to_string() -> json::String("abcde".to_string())
    })
});

(试试吧,这里)

我使用了自定义地图构造宏,因为遗憾的是,Rust标准库没有提供一个宏(我希望如此)。

Json只是一个常规枚举,因此您必须使用模式匹配来从中提取值。Object包含一个TreeMap实例,因此您必须使用它的方法来检查对象结构:

代码语言:javascript
复制
if let json::Object(ref m) = data {
    if let Some(value) = m.find_with(|k| "submap".cmp(k)) {
        println!("Found value at 'submap' key: {}", value);
    } else {
        println!("'submap' key does not exist");
    }
} else {
    println!("data is not an object")
}

更新

显然,Json提供了许多方便的方法,包括find(),如果目标是具有相应键的Object,则返回Option<&Json>

代码语言:javascript
复制
if let Some(value) = data.find("submap") {
    println!("Found value at 'submap' key: {}", value);
} else {
    println!("'submap' key does not exist or data is not an Object");
}

谢谢克里斯摩根的发现。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26758907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档