Простая модификация объекта 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();

И все скомпилировано и работает (пока)

Другие вопросы по тегам