如何在C ++中更改JSON对象名称而不更改其值?

时间:2019-01-27 10:48:41

标签: c++ nlohmann-json

我正在将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 :(得分:0)

与键“伦敦”关联的值是整个子树json对象,其中包含其他3个键及其值。 j["London"] = "Something_New";行不会更改键“伦敦”,而是会更改其值。因此,您最终获得了对“ 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");