如何完全删除json数组元素(使用jsoncpp)

时间:2016-10-12 05:40:40

标签: c++ jsoncpp

我正在使用jsoncpp,我有一组数据如下,我想搜索一些节点并删除数组元素,一些当我删除时,它变成{},是否可以用{}完全删除?

删除前的数据:

{
    "any" : [
    {
        "any_id" : "a1",
        "infos" : [
        {
            "info_id" : "i1",
            "path" : "",
            "version" : "1.0"
        }
        ]
    },
    {
        "any_id" : "a2",
        "infos" : [
        {
            "info_id" : "i1",
            "path" : "",
            "version" : "1.0"
        },
        {
            "info_id" : "i2",
            "path" : "D:\\",
            "version" : "1.0"
        },
        {
            "info_id" : "i3",
            "path" : "",
            "version" : "1.0"
        },
        {
            "info_id" : "i4",
            "path" : "D:\\",
            "version" : "1.0"
        }
        ]
    },
    {
        "any_id" : "a3",
        "infos" : [
        {
            "info_id" : "i4",
            "path" : "",
            "version" : "1.0"
        }
        ]
    }
    ]
}

删除后的数据:

{
    "any" : [
    {
        "any_id" : "a1",
        "infos" : [
        {
            "info_id" : "i1",
            "path" : "",
            "version" : "1.0"
        }
        ]
    },
    {
        "any_id" : "a2",
        "infos" : [
        {
            "info_id" : "i1",
            "path" : "",
            "version" : "1.0"
        },
        {
        },
        {
            "info_id" : "i3",
            "path" : "",
            "version" : "1.0"
        },
        {
        }
        ]
    },
    {
        "any_id" : "a3",
        "infos" : [
        {
            "info_id" : "i4",
            "path" : "",
            "version" : "1.0"
        }
        ]
    }
    ]
}

在C ++中,我有以下代码,查找any_id和删除数组元素的路径:

for (Json::ValueIterator &itr_any = data["any"].begin();
        itr_any != data["any"].end(); ++itr_any)
    {
        if (0 == _stricmp((*itr_any)["any_id"].asString().c_str(), "a2"))
        {
            for (Json::ValueIterator &itr_res = (*itr_any)["infos"].begin();
                itr_res != (*itr_any)["infos"].end(); ++itr_res)
            {
                if (0 == _stricmp((*itr_res)["path"].asString().c_str(), "D:\\"))
                {
                    (*itr_res).clear();
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

使用(*itr_res).clear();实际上是清空所选数组中对象的内容。

JsonCpp API不公开操作数组的方法,因此删除项目的最简单方法是构建一个不包含匹配元素的新数组:

for (Json::ValueIterator &itr_any = data["any"].begin(); itr_any != data["any"].end(); ++itr_any)
    if (0 == _stricmp((*itr_any)["any_id"].asString().c_str(), "a2"))
    {
        Json::Value newArray = Json::arrayValue;
        for (Json::ValueIterator &itr_res = (*itr_any)["infos"].begin(); itr_res != (*itr_any)["infos"].end(); ++itr_res)
            if (_stricmp((*itr_res)["path"].asString().c_str(), "D:\\"))
                newArray.append((*itr_res));
        (*itr_any)["infos"] = newArray;
    }