Как удалить вложенные данные JSON с помощью Nlohmann C ++ - PullRequest
0 голосов
/ 16 октября 2019

У меня есть данные JSON ниже. Я использую nlohmann json в C++.

{
    "CompanyName": "XYZ Tech",
    "Created": "2019-10-16T20:14:29Z",
    "TxnId": "4509237",
    "Tags": [
        {
            "ROIId": "Default",
            "Time": 71,
            "Tracker": "emp10"
        },
        {
            "ROIId": "MC16",
            "Time": 21,
            "TrackerId": "emp10"
        },
        {
            "ROIId": "Default",
            "Time": 11,
            "TrackerId": "emp11"
        },
        {
            "ROIId": "MC18",
            "Time": 10,
            "TrackerId": "emp11"
        }
    ],
    "Type": "TxnData"
}

В приведенных выше данных json, внутри Tags, у нас есть данные, где ROIId равно Default. Я хочу удалить его, чтобы данные стали:

{
    "CompanyName": "XYZ Tech",
    "Created": "2019-10-16T20:14:29Z",
    "TxnId": "4509237",
    "Tags": [
        {
            "ROIId": "MC16",
            "Time": 21,
            "TrackerId": "emp10"
        },
        {
            "ROIId": "MC18",
            "Time": 10,
            "TrackerId": "emp11"
        }
    ],
    "Type": "TxnData"
}

Как я могу сделать это в C ++. Спасибо

1 Ответ

0 голосов
/ 19 октября 2019

Я предлагаю перебрать json::array, хранящийся в тегах, и сохранить ключ соответствующих элементов. Таким образом, вы можете позже подтвердить удаление и безопасно удалить элементы.

Обратите внимание, что удаление точно так же, как стирание с вектором STL - я предпочитаю удалять с конца вектора, чтобы избежать изменения ключей при удалении несколькихelements.

Вот быстрое и грязное демо

А вот код:

#include <iostream>
#include <vector>
#include "json3.6.1.hpp"

unsigned removeDefaultROIID(nlohmann::json& jsonObject, const std::string& value) {
    std::vector<int> toremove;
    //Loop through the `tags` json::array and create a vector of indexes to delete:
    for (auto &it : jsonObject["Tags"].items()) {
    //`.get<std::string>()` is the best way to make sure we are getting the value as std::string
        if (it.value().at("ROIId").get<std::string>() == value) 
            toremove.push_back(stoi(it.key()));
    }
    //sort it before erase - we want to delete first biggest index:
    std::sort(toremove.rbegin(), toremove.rend());
    //delete using `.erase()` method:
    for (int &it : toremove)
        jsonObject["Tags"].erase(jsonObject["Tags"].begin() + it);
    return toremove.size();
}

int main()
{
    //Create the JSON object:
    nlohmann::json jsonObject = R"({"CompanyName":"XYZ Tech","Created":"2019-10-16T20:14:29Z","TxnId":"4509237","Tags":[{"ROIId": "Default","Time": 71,"Tracker": "emp10"},{"ROIId":"MC16","Time": 21,"TrackerId": "emp10"},{"ROIId":"Default","Time":11,"TrackerId":"emp11"},{"ROIId":"MC18","Time": 10,"TrackerId":"emp11"}],"Type":"TxnData"})"_json;

    std::cout << "JSON nested object value conditional erase:" << std::endl;
    std::cout << "JSON object TAGS count - BEFORE deletion:" << jsonObject["Tags"].size() << std::endl;
    //Call the method -> jlson is passed by ref
    unsigned removed = removeDefaultROIID(jsonObject, "Default");

    std::cout << "JSON object TAGS count - AFTER deletion:" << jsonObject["Tags"].size() << std::endl;

    return 0;
}
...