Как стереть элемент внутри элемента в файле nlohmann::json C

#c #json #nlohmann-json

Вопрос:

Я хочу знать, как я могу удалить элемент внутри элемента в библиотеке nlohmann::json C .

Пример файла Json:

 {
    "Users":{
        "User1":{
            "Name":"BOB",
            "DeleteMe":"IWantToBeDeleted!"
        }
    }
}
 

То, что я хочу удалить, — это «Удалить тему»:»IWantToBeDeleted!», которая находится внутри «Пользователи» и «Пользователь1».
Я просмотрел документацию по basic_json::erase, но я вижу только, как удалить элемент в корне файла json, например «Пользователи» в моем примере файла.

Любая помощь будет признательна =D

Комментарии:

1. Я думаю, что вы, вероятно, можете сделать то, что вам нужно, с помощью комбинации json_pointer и erase . Используйте указатель, чтобы получить ссылку на User1 узел и erase удалить DeleteMe узел

Ответ №1:

basic_json::erase стирается только из указанного в данный момент json узла-поэтому, если ваш json объект является внешним объектом, поэтому вы можете стирать только записи верхнего уровня. То, что вам нужно, — это способ получить внутренний узел User1 и вызвать erase DeleteMe оттуда ключ.

Вы должны быть в состоянии легко получить ссылку на User1 использование json_pointer -что в основном представляет собой строковый путь к узлам, которые необходимо пройти, чтобы получить нужный вам узел. Как только у вас будет узел, это должно быть так же просто, как позвонить erase .

Что-то вроде этого:

 auto json = nlohmann::json{/* some json object */};
auto path = nlohmann::json_pointer<nlohmann::json>{"/Users/User1"};


// Get a reference to the 'user1' json object at the specified path
autoamp; user1 = json[path];

// Erase from the 'user1' node by key name
user1.erase("DeleteMe");
 

Live Example

Комментарии:

1.Это можно немного улучшить, используя две аккуратные функции , предоставляемые самим json_pointer, parent_pointer() и back() , таким образом, нет необходимости разделять путь к ключу «вручную» auto ptr = nlohmann::json::json_pointer( "/Users/User1/DeleteMe" ); json.at( ptr.parent_pointer() ).erase( ptr.back() ); gcc.godbolt.org/z/avxT5q9YP