1

我在 Rust 1.6.0 中有一个 JSON 编码的对象。我想从 JSON 解码它,更改一个键的值,然后再次将其转换回 JSON 编码字符串。我不想写一个结构来保存数据。

我正在使用 rustc_serialize,它似乎主要是围绕序列化结构构建并自动执行此操作,但我只想要一个简单的 JSON 修改。

json_contents是一个String具有原始编码 JSON 对象的对象。

let new_value = json::Json::from_str(&format!("[\"http://localhost:{}\"]", port)).unwrap();

let mut myjson_0 = json::Json::from_str(&json_contents).unwrap();
let mut myjson = tilejson_0.as_object().unwrap();
myjson.insert("mykey".to_owned(), new_value);
let new_json: String = json::encode(&myjson).unwrap();

但是我收到以下错误:

src/main.rs:53:5: 53:13 error: cannot borrow immutable borrowed content `*myjson` as mutable
src/main.rs:53     myjson.insert("mykey".to_owned(), new_value);
                   ^~~~~~
error: aborting due to previous error

我怎样才能编译这个?我可以使用更好、更简单的 JSON Rust 库吗?

4

1 回答 1

0

一些调试为我解决了这个问题:

我替换了这段代码:

let mut myjson = tilejson_0.as_object().unwrap();

有了这个,为了确保我拥有我认为我拥有的类型:

let mut myjson: BTreeMap<String, json::Json> = tilejson_0.as_object().unwrap();

我得到了这个编译器错误:

src/main.rs:52:54: 52:85 error: mismatched types:
 expected `collections::btree::map::BTreeMap<collections::string::String, rustc_serialize::json::Json>`,
    found `&collections::btree::map::BTreeMap<collections::string::String, rustc_serialize::json::Json>`
(expected struct `collections::btree::map::BTreeMap`,
    found &-ptr) [E0308]
src/main.rs:52     let mut myjson: BTreeMap<String, json::Json>  tilejson_0.as_object().unwrap();

显然我错了。而不是一个拥有 BTreeMap的,我有一个参考,&BTreeMap.

解决方案是将行更改为:

let mut myjson = tilejson_0.as_object().unwrap().to_owned();

一切都编译并工作(到目前为止)

于 2016-03-01T10:54:45.007 回答