C++11 我想从boost库的ptree类型数据中删除最后一个元素
我有JSON格式的数据,我想删除最后一个数据,该数据采用以下格式:C++11 我想从boost库的ptree类型数据中删除最后一个元素,c++11,boost,C++11,Boost,我有JSON格式的数据,我想删除最后一个数据,该数据采用以下格式: "data": { "user": { "addr":[ [ { "firstline":"123", "secondline":"LA" }, { "firstline":"643", "secondline":"NY" }
"data":
{
"user":
{
"addr":[
[
{
"firstline":"123",
"secondline":"LA"
},
{
"firstline":"643",
"secondline":"NY"
},
{
"firstline":" ",
"secondline":"VA"
}
]
]
}
}
我想删除上面用户的最后一个地址,其中包含空的firstline
有一个巨大的警告,Boost属性树不是JSON库。有许多东西它不能恰当地表现出来
您可能会遇到这种情况,因为您的示例一开始就不是有效的JSON
那么,让我们将固定数据读入属性树:
std::istringstream iss(R"({"data": {
"user": {
"addr": [ [
{ "firstline": "123", "secondline": "LA" },
{ "firstline": "643", "secondline": "NY" },
{ "firstline": " ", "secondline": "VA" }
] ]
}
}})”
现在,让我们找到地址:
auto& addr = pt.get_child("data.user.addr").front().second;
这是一个包含单个元素的数组(也是一个数组),让我们得到:
auto& addrlines = addr.front().second;
这是一个有三个地址行的数组。请删除最后一个地址行:
addrlines.erase(std::prev(addr.end()));
打印结果:
write_json(std::cout, pt);
演示
#include <boost/property_tree/json_parser.hpp>
#include <iostream>
#include <iomanip>
int main() {
std::istringstream iss(R"({"data": {
"user": {
"addr": [ [
{ "firstline": "123", "secondline": "LA" },
{ "firstline": "643", "secondline": "NY" },
{ "firstline": " ", "secondline": "VA" }
] ]
}
}})");
boost::property_tree::ptree pt;
read_json(iss, pt);
auto& addr = pt.get_child("data.user.addr").front().second;
auto& addrlines = addr.front().second;
addrlines.erase(std::prev(addr.end()));
write_json(std::cout, pt);
}
auto& addr = pt.get_child("data.user.addr");
auto& addrlines = addr.front().second;
for (auto it = addrlines.begin(); it != addrlines.end();) {
auto firstline = it->second.get_optional<std::string>("firstline").value_or("");
trim(firstline);
if (firstline.empty()) {
it = addrlines.erase(it);
} else {
++it;
}
}
或者
要删除第一行为空的所有地址(在修剪空白后):
#include <boost/property_tree/json_parser.hpp>
#include <iostream>
#include <iomanip>
int main() {
std::istringstream iss(R"({"data": {
"user": {
"addr": [ [
{ "firstline": "123", "secondline": "LA" },
{ "firstline": "643", "secondline": "NY" },
{ "firstline": " ", "secondline": "VA" }
] ]
}
}})");
boost::property_tree::ptree pt;
read_json(iss, pt);
auto& addr = pt.get_child("data.user.addr").front().second;
auto& addrlines = addr.front().second;
addrlines.erase(std::prev(addr.end()));
write_json(std::cout, pt);
}
auto& addr = pt.get_child("data.user.addr");
auto& addrlines = addr.front().second;
for (auto it = addrlines.begin(); it != addrlines.end();) {
auto firstline = it->second.get_optional<std::string>("firstline").value_or("");
trim(firstline);
if (firstline.empty()) {
it = addrlines.erase(it);
} else {
++it;
}
}
auto&addr=pt.get_child(“data.user.addr”);
auto&addrlines=addr.front().second;
for(auto it=addrlines.begin();it!=addrlines.end();){
auto firstline=it->second.get_可选(“firstline”).value_或(“”);
修剪(第一线);
if(firstline.empty()){
它=addrlines.erase(它);
}否则{
++它;
}
}
需要注意的是,Boost属性树不是一个JSON库,它不能正确地表示很多东西
您可能会遇到这种情况,因为您的示例一开始就不是有效的JSON
那么,让我们将固定数据读入属性树:
std::istringstream iss(R"({"data": {
"user": {
"addr": [ [
{ "firstline": "123", "secondline": "LA" },
{ "firstline": "643", "secondline": "NY" },
{ "firstline": " ", "secondline": "VA" }
] ]
}
}})”
现在,让我们找到地址:
auto& addr = pt.get_child("data.user.addr").front().second;
这是一个包含单个元素的数组(也是一个数组),让我们得到:
auto& addrlines = addr.front().second;
这是一个有三条地址线的数组。删除最后一个:
addrlines.erase(std::prev(addr.end()));
打印结果:
write_json(std::cout, pt);
演示
#include <boost/property_tree/json_parser.hpp>
#include <iostream>
#include <iomanip>
int main() {
std::istringstream iss(R"({"data": {
"user": {
"addr": [ [
{ "firstline": "123", "secondline": "LA" },
{ "firstline": "643", "secondline": "NY" },
{ "firstline": " ", "secondline": "VA" }
] ]
}
}})");
boost::property_tree::ptree pt;
read_json(iss, pt);
auto& addr = pt.get_child("data.user.addr").front().second;
auto& addrlines = addr.front().second;
addrlines.erase(std::prev(addr.end()));
write_json(std::cout, pt);
}
auto& addr = pt.get_child("data.user.addr");
auto& addrlines = addr.front().second;
for (auto it = addrlines.begin(); it != addrlines.end();) {
auto firstline = it->second.get_optional<std::string>("firstline").value_or("");
trim(firstline);
if (firstline.empty()) {
it = addrlines.erase(it);
} else {
++it;
}
}
或者
要删除第一行为空的所有地址(在修剪空白后):
#include <boost/property_tree/json_parser.hpp>
#include <iostream>
#include <iomanip>
int main() {
std::istringstream iss(R"({"data": {
"user": {
"addr": [ [
{ "firstline": "123", "secondline": "LA" },
{ "firstline": "643", "secondline": "NY" },
{ "firstline": " ", "secondline": "VA" }
] ]
}
}})");
boost::property_tree::ptree pt;
read_json(iss, pt);
auto& addr = pt.get_child("data.user.addr").front().second;
auto& addrlines = addr.front().second;
addrlines.erase(std::prev(addr.end()));
write_json(std::cout, pt);
}
auto& addr = pt.get_child("data.user.addr");
auto& addrlines = addr.front().second;
for (auto it = addrlines.begin(); it != addrlines.end();) {
auto firstline = it->second.get_optional<std::string>("firstline").value_or("");
trim(firstline);
if (firstline.empty()) {
it = addrlines.erase(it);
} else {
++it;
}
}
auto&addr=pt.get_child(“data.user.addr”);
auto&addrlines=addr.front().second;
for(auto it=addrlines.begin();it!=addrlines.end();){
auto firstline=it->second.get_可选(“firstline”).value_或(“”);
修剪(第一线);
if(firstline.empty()){
它=addrlines.erase(它);
}否则{
++它;
}
}
请向我们展示您到目前为止所做的工作请向我们展示您到目前为止所做的工作