簡體   English   中英

如何使用“鍵”刪除或擦除 Json::Value object 中的“鍵”:“值”對?

[英]How to remove or erase a "key":"value" pair in a Json::Value object using "key"?

我正在使用 C++ 語言、visual studio 2022,並使用jsoncpp庫來處理 Json。

給你一個想法,這是我正在使用的 Json 數據的示例

[ 
    { 
        "name":"Regina Eagle",
        "job":"Biologist",
        "salary":"728148120",
        "email":"Regina_Eagle6155@y96lx.store",
        "city":"Nashville"
    },
    { 
        "name":"Julius Baker",
        "job":"Fabricator",
        "salary":"299380360",
        "email":"Julius_Baker9507@voylg.center",
        "city":"Las Vegas"
    },
    { 
        "name":"Rocco Sawyer",
        "job":"Chef Manager",
        "salary":"223764496",
        "email":"Rocco_Sawyer4620@qu9ml.club",
        "city":"San Francisco"
    },
    { 
        "name":"Chad Murray",
        "job":"Project Manager",
        "salary":"43031808",
        "email":"Chad_Murray6940@jcf8v.store",
        "city":"Bridgeport"
    },
    { 
        "name":"Rocco Parker",
        "job":"Lecturer",
        "salary":"322089172",
        "email":"Rocco_Parker202@ag5wi.solutions",
        "city":"Indianapolis"
    }
]

它是一個 Json 對象數組(帶有鍵值對)。 我有一組列標題,例如:{"name","job","salary"},我想對 json 數據進行排序,使每個 object 僅包含給定集合中的列。

這是我的方法:

將 json 數據存儲在 Json::Value object(假設為記錄)中。

遍歷記錄(因為它是一個數組)。

創建另一個循環以迭代存儲在每個索引處的 object。

提取鍵值對的鍵並檢查它是否存在於集合中。

如果存在則繼續,否則如果不存在則從那里刪除該 key:value 條目。

這樣我們可以在循環 object 時刪除不需要的列。

這是代碼片段:

set<string> col {"name","job","salary"};
Json::Value records = [ 
    { 
        "name":"Regina Eagle",
        "job":"Biologist",
        "salary":"728148120",
        "email":"Regina_Eagle6155@y96lx.store",
        "city":"Nashville"
    },
    { 
        "name":"Julius Baker",
        "job":"Fabricator",
        "salary":"299380360",
        "email":"Julius_Baker9507@voylg.center",
        "city":"Las Vegas"
    },
    { 
        "name":"Rocco Sawyer",
        "job":"Chef Manager",
        "salary":"223764496",
        "email":"Rocco_Sawyer4620@qu9ml.club",
        "city":"San Francisco"
    },
    { 
        "name":"Chad Murray",
        "job":"Project Manager",
        "salary":"43031808",
        "email":"Chad_Murray6940@jcf8v.store",
        "city":"Bridgeport"
    },
    { 
        "name":"Rocco Parker",
        "job":"Lecturer",
        "salary":"322089172",
        "email":"Rocco_Parker202@ag5wi.solutions",
        "city":"Indianapolis"
    }
];

for (int i = 0; i<records.size(); i++)
{
  for (auto j = records[i].begin(); j != records[i].end(); j++)
    {
      string key = j.key().asString();
      if (col.find(key) != col.end())
        {
          continue;
        }
      else
        {
          records[i].removeMember(key);
        }
    }
}

它工作正常,直到“removeMember”function 開始運行,並拋出一條錯誤消息說無法增加迭代器的值。

表達式:無法增加值初始化的映射/集合迭代器

難道我做錯了什么?

或者還有另一種/更好的方法嗎?

請指教。

不要在您當前迭代的容器中刪除或添加元素。

JSON 對象存儲在std::map中,並且removeMember調用std::map::erase 它使當前迭代器無效並且不能再遞增。 j++導致錯誤。

一種方法是首先只存儲要刪除的屬性的鍵,然后在單獨的循環中刪除屬性。

set<string> col {"name","job","salary"};
Json::Value records = [ 
    { 
        "name":"Regina Eagle",
        "job":"Biologist",
        "salary":"728148120",
        "email":"Regina_Eagle6155@y96lx.store",
        "city":"Nashville"
    },
    { 
        "name":"Julius Baker",
        "job":"Fabricator",
        "salary":"299380360",
        "email":"Julius_Baker9507@voylg.center",
        "city":"Las Vegas"
    },
    { 
        "name":"Rocco Sawyer",
        "job":"Chef Manager",
        "salary":"223764496",
        "email":"Rocco_Sawyer4620@qu9ml.club",
        "city":"San Francisco"
    },
    { 
        "name":"Chad Murray",
        "job":"Project Manager",
        "salary":"43031808",
        "email":"Chad_Murray6940@jcf8v.store",
        "city":"Bridgeport"
    },
    { 
        "name":"Rocco Parker",
        "job":"Lecturer",
        "salary":"322089172",
        "email":"Rocco_Parker202@ag5wi.solutions",
        "city":"Indianapolis"
    }
];

for (int i = 0; i<records.size(); i++)
{
  std::vector<std::string> toRemove;
  for (auto j = records[i].begin(); j != records[i].end(); j++)
    {
      string key = j.key().asString();
      if (col.find(key) != col.end())
        {
          continue;
        }
      else
        {
          // records[i].removeMember(key);
          toRemove.push_back(key);
        }
    }
  for (const auto &key : toRemove)
    {
      records[i].removeMember(key);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM