#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");
Комментарии:
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