Простая модификация объекта JSON без сериализации приводит к тому, что "нельзя заимствовать неизменяемый заимствованный контент как изменяемый"
У меня есть JSON-кодированный объект в Rust 1.6.0. Я хочу декодировать его из 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, которую я могу использовать?
1 ответ
Некоторая отладка исправила эту проблему для меня:
Я заменил этот код:
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();
И все скомпилировано и работает (пока)