美文网首页C++C++入门不放弃
RapidJson递归去除空值元素Value

RapidJson递归去除空值元素Value

作者: Cloudox_ | 来源:发表于2018-08-24 16:23 被阅读21次

RapidJson是一款高效的C++处理JSON字符串的库。

教程:http://rapidjson.org/zh-cn/md_doc_tutorial_8zh-cn.html#QueryObject
源码:https://github.com/Tencent/rapidjson

但不得不说教程写的不太全,网上资料也很少,大都重复教程的范畴。

项目中有个蛋疼的需求要把JSON字符串中值为空的键值对去掉,C++下处理字符串本就难受,幸亏有RapidJson帮忙。

参考教程有基本函数说明,处理逻辑代码如下:


// 递归处理json内部空元素
void HandleChild(Value &object) {
    for (Value::ConstMemberIterator itr = object.MemberBegin(); itr != object.MemberEnd();) {
        if (itr->value.IsObject()) {
            HandleChild(object[itr->name]);
        }
        if (itr->value.IsNull() || itr->value == "" || itr->value.Empty()) {
            itr = object.EraseMember(itr);
        } else {
            itr++;
        }
    }
}

// 处理json体,排除其中为空的元素
std::string HandleJsonString(const char* jsonString) {
    Document document;
    document.Parse(jsonString);
    for (Value::ConstMemberIterator itr = document.MemberBegin(); itr != document.MemberEnd();) {
        if (itr->value.IsObject()) {
            HandleChild(document[itr->name]);
        }
        if (itr->value.IsNull() || itr->value == "" || itr->value.Empty()) {
            itr = document.EraseMember(itr);
        } else {
            itr++;
        }
    }
    // 转回字符串返回
    StringBuffer buffer;
    Writer<StringBuffer> writer(buffer);
    document.Accept(writer);
    return buffer.GetString();
}

{
        // 传入字符串,排空处理
        postParm = HandleJsonString((char*)jsonString.data());
}

首先是HandleJsonString方法,该方法用于接收要处理的json字符串,解析成RapidJson的Document类型的JSON树之后,就可以利用迭代器遍历来判断每个元素值(Value)是否为空了。如果遇到空的,则从document中移除,注意移除后,迭代器会指向后一个元素,所以此时迭代器不能递增。全部判断处理完后,就可以转回字符串来返回了。

需要注意的是,这样的遍历只能处理JSON体最外层的元素是否为空,对于多层结构的JSON体就不能判断了,所以需要HandleChild来递归处理。

HandleChild接收的参数要注意为引用形式,这样才能保证修改的是原结构体数据。

在HandleJsonString中,遇到Object类型的元素,表示还有内部结构体,所以就将其传入HandleChild中,在HandleChild中递归的时候也是一样的判断逻辑,如果遇到Object,则递归调用。同时每次都判断元素值是否为空值、空字符串或者空Object、Array等。这样才能保证去除干净,否则会出现一个节点内部元素都为空,全部去除后,这个元素还留着。

举个例子,这样一个JSON:

{
    name:"cloudox",
    sex:"boy",
    age:"",
    skill:{
        ios:true,
        cpp:true
        go:
    }
    hobby:{
        dev:""
    }
}

处理后应该变成:

{
    name:"cloudox",
    sex:"boy",
    skill:{
        ios:true,
        cpp:true
    }
}

查看作者首页

相关文章

  • RapidJson递归去除空值元素Value

    RapidJson是一款高效的C++处理JSON字符串的库。 教程:http://rapidjson.org/zh...

  • Swift-枚举

    基础例子 原始值(Raw Value) 关联值(Associate Value) 可选型就是枚举类型 枚举递归

  • RapidJson中AddMember字符串使用Value和St

    RapidJson中AddMember字符串使用Value和StringRef的区别 Value:如果字符串生命周...

  • Haskell(三)递归

    递归 使用递归求List中得最大值,先设置边界条件,如果List为空,则运行异常,如果List只有一个元素,直接返...

  • 枚举

    原始型Raw Value Associate Value 关联值 可选型的实质是枚举 枚举递归,前面要有indir...

  • jQuery属性操作

    表单内容value值 元素的属性

  • 数组-去重

    1、ES6: new Set() Set对象是值的集合,里面的元素唯一,不能去除空对象{}; 2、indexOf ...

  • jQuery属性操作

    val([value]):读写input的value值 attr():读写元素内嵌的属性值image.png re...

  • 数组的去重、获取下标、删除、添加等各种操作

    1.数组去除空值 2.通过某元素获取在数组中对应的下标(也是判断是否存在于这个数组中) 3.改变数组对象中元素的值...

  • Bash中对输入的处理

    变量替换操作 ${VAR:-value} 如果变量为空,返回新值。 ${VAR:=value} 如果变量为空,返回...

网友评论

    本文标题:RapidJson递归去除空值元素Value

    本文链接:https://www.haomeiwen.com/subject/xuxiiftx.html