如何在Rust中遍历JSON列表?

3

我正在加载一个gltf资产(基本上是一个大的json文件)。我想迭代其中的一个字段,即我正在做这个:

let data = fs::read_to_string("Assets/werewolf_animated.gltf").expect("Unable to read file");
    let json: serde_json::Value =
        serde_json::from_str(&data).expect("JSON was not well-formatted");

    for skin in json["skins"].into()
    {
        println!("{:?}", skin["inverseBindMatrices"]);
    }

但是显然Rust不能推断类型,我得到了以下错误信息:
 println!("{:?}", skin["inverseBindMatrices"]);
   |                          ^^^^ cannot infer type

我该如何迭代遍历皮肤json数组中的每个条目?

就这个特定字段而言,它在json文件中的外观如下:

"skins" : [
        {
            "inverseBindMatrices" : 5,
            "joints" : [
                64,
                53,
                52,
                51,
                2,
            ],
            "name" : "Armature"
        }
    ],
1个回答

3

Value 是所有可能的 JSON 值类型的枚举,因此您还需要处理非数组情况(如 null 值、布尔值、数字、字符串和对象)。辅助方法 Value::as_array() 返回一个 Option,在非数组情况下为 None

if let Some(skins) = json["skins"].as_array() {
    for skin in skins {
        // ...
    }
}

在这种情况下,这基本上等同于:
if let serde_json::Value::Array(skins) = json["skins"] {
    for skin in skins {
        // ...
    }
}

如果您希望在该值不是数组时通过Result信号传递错误,可以将Value::as_array()Option::ok_or()结合使用。以下是一个示例,假设存在自定义错误枚举DataParseError:
for skin in json["skins"].as_array().ok_or(DataParseError::SkinsNotAnArray)? {
    // ...
}

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