Как изменить имя объекта json без изменения его значений в C ++? - PullRequest
0 голосов
/ 27 января 2019

Я использую JSON для современного C ++. И у меня есть файл JSON, который содержит некоторые данные, такие как:

 {
"London": {
    "Adress": "londonas iela 123",
    "Name": "London",
    "Shortname": "LL"
},
"Riga": {
    "Adrese": "lidostas iela 1",
    "Name": "Riga",
    "Shortname": "RIX"
}

И я нашел способ изменить значения «Adrese», «Name», «Shortname». Как видите, у меня «имя» и имя элемента ключа установлены на одно и то же.

Но мне нужно изменить и ключевой элемент, и значение «имя».

Так что в конце, когда каким-то образом в коде я изменяю его, это будет выглядеть так:

{
"Something_New": {
    "Adress": "londonas iela 123",
    "Name": "Something_New",
    "Shortname": "LL"
},
"Riga": {
    "Adrese": "lidostas iela 1",
    "Name": "Riga",
    "Shortname": "RIX"
}

Я пробовал:

 /other_code/
 json j
 /functions_for_opening_json file/ 
 j["London"]["Name"] = "Something_New"; //this changes the value "name"
 j["London"] = "Something_New"; //But this replaces "London" with 
 "Something_new" and deletes all of its inside values.

Тогда я попробовал что-то вроде:

for(auto& el : j.items()){
if(el.key() == "London"){
el.key() = "Something_New";}
}

Но это тоже не сработало.

Я бы хотел что-то вроде j ["London"] = "Something_new" и чтобы в нем были все значения, которые изначально были для "London".

1 Ответ

0 голосов
/ 27 января 2019

Значение, связанное с ключом "Лондон", представляет собой весь объект json поддерева, содержащий остальные 3 ключа с их значениями.Эта строка j["London"] = "Something_New"; меняет не ключ "Лондон", а его значение.В итоге получается пара «Лондон»: «Что-то новое», перезаписывающая объект поддерева json.Ключи хранятся внутри как std :: map.Поэтому вы не можете просто переименовать такой ключ.Попробуйте:

void change_key(json &j, const std::string& oldKey, const std::string& newKey)
{
    auto itr = j.find(oldKey); // try catch this, handle case when key is not found
    std::swap(j[newKey], itr.value());
    object.erase(itr);
}

А потом

change_key(j, "London", "Something_New");
...