rapidjson 实现未知json数据解析,拿到每一个key和value

利用rapidjson实现未知json数据的解析,拿到每一个key和value,用vs2010实现。

引用头文件

#include "rapidjson/document.h"

#include <string>

using namespace std;

using namespace rapidjson;

程序段

string strJsonTest = "{\"item_1\":\"value_1\",\"item_2\":\"value_2\",\"item_3\":\"value_3\",\"item_4\":\"value_4\",\"item_arr\":[\"arr_vaule_1\",\"arr_vaule_2\"]}";
Document docTest;
docTest.Parse<0>(strJsonTest.c_str());

if (!docTest.HasParseError())
{
        for (rapidjson::Value::ConstMemberIterator itr = docTest.MemberBegin(); itr != docTest.MemberEnd(); itr++)
        {
                Value jKey;
                Value jValue; 
                Document::AllocatorType allocator;
                jKey.CopyFrom(itr->name, allocator);
                jValue.CopyFrom(itr->value,allocator);
               if (jKey.IsString())
               {
                       string name = jKey.GetString();
                       printf("\r\nname: %s\r\n",name.c_str());
               } 
        } 
}

利用jsoncpp实现未知json数据的解析,拿到每一个key和value,用vs2010实现。

Json::Value valRoot;
Json::Reader reader;

        if (!reader.parse(strJson, valRoot))
        {
            return JSON_PARSE_ERR;
        }
        
        Json::Value::Members members;
        members = valRoot.getMemberNames();
        for (Json::Value::Members::iterator iterMember = members.begin(); iterMember != members.end(); iterMember++)
        {
            std::string strKey = *iterMember;
            if (valRoot[strKey.c_str()].isString())
            {
                std::string strVal = valRoot[strKey.c_str()].asString();
                std::cout<<strKey.c_str()<<":"<<strVal.c_str()<<std::endl;
            }
            else if (valRoot[strKey.c_str()].isInt())
            {
                int iVal = valRoot[strKey.c_str()].asInt();
                std::cout<<strKey.c_str()<<":"<<iVal<<std::endl;
            }
            else if (valRoot[strKey.c_str()].isDouble())
            {
                double dVal = valRoot[strKey.c_str()].asDouble();
                std::cout<<strKey.c_str()<<":"<<dVal<<std::endl;
            }
            else
            {
                std::string strVal = valRoot[strKey.c_str()].toStyledString();
                std::cout<<strKey.c_str()<<":"<<strVal.c_str()<<std::endl;
            }
        }


提供两个函数例子实现:

jsoncpp:

int PrintJsonString(const std::string& strJson)
    {
        Json::Value valRoot;
        Json::Reader reader;

        if (!reader.parse(strJson, valRoot))
        {
            return -1;
        }
        
        Json::Value::Members members;
        members = valRoot.getMemberNames();
        for (Json::Value::Members::iterator iterMember = members.begin(); iterMember != members.end(); iterMember++)
        {
            std::string strKey = *iterMember;
            if (valRoot[strKey.c_str()].isString())
            {
                std::string strVal = valRoot[strKey.c_str()].asString();
                std::cout<<strKey.c_str()<<":"<<strVal.c_str()<<std::endl;
            }
            else if (valRoot[strKey.c_str()].isInt())
            {
                int iVal = valRoot[strKey.c_str()].asInt();
                std::cout<<strKey.c_str()<<":"<<iVal<<std::endl;
            }
            else if (valRoot[strKey.c_str()].isDouble())
            {
                double dVal = valRoot[strKey.c_str()].asDouble();
                std::cout<<strKey.c_str()<<":"<<dVal<<std::endl;
            }
            else
            {
                std::string strVal = valRoot[strKey.c_str()].toStyledString();
                std::cout<<strKey.c_str()<<":"<<strVal.c_str()<<std::endl;
            }
        }

        return 0;
    }

rapidjson:

std::string JsonToString(rapidjson::Value& valRoot)
    {
        rapidjson::StringBuffer strBuf;
        strBuf.Clear();
        rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);
        valRoot.Accept(writer);
        std::string strJson = strBuf.GetString();
        return strJson;
    }
int PrintJsonString(const std::string& strJson)
    {
        int iStart = strJson.find("{");
        int iEnd = strJson.rfind("}");
        if ((iStart < 0) || (iEnd < 1) || (iStart > iEnd))
        {
            return -1;
        }
        std::string strTemp = strJson.substr(iStart, (iEnd - iStart + 1));    
        
        rapidjson::Document doc;
        
        doc.Parse(strTemp.c_str());
        if (doc.HasParseError())
        {
            return -1;
        }

	rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();

        for (rapidjson::Value::ConstMemberIterator iter = doc.MemberBegin(); iter != doc.MemberEnd(); iter++)
        {
            rapidjson::Value jKey;
            rapidjson::Value jValue;            
            
            jKey.CopyFrom(iter->name, allocator);
            jValue.CopyFrom(iter->value, allocator);

            if (jKey.IsString())
            {
                std::string strKey = jKey.GetString();  
                if (jValue.IsString())
                {
                    std::string strVal = jValue.GetString();
                    std::cout<<strKey.c_str()<<":"<<strVal.c_str()<<std::endl;
                }
                else if (jValue.IsInt())
                {
                    int iVal = jValue.GetInt();
                    std::cout<<strKey.c_str()<<":"<<iVal<<std::endl;
                }
                else if (jValue.IsDouble())
                {
                    double dVal = jValue.GetDouble();
                    std::cout<<strKey.c_str()<<":"<<dVal<<std::endl;
                }
                else
                {
                    std::string strVal = JsonToString(jValue);
                    std::cout<<strKey.c_str()<<":"<<strVal.c_str()<<std::endl;
                }
            }
        }

        return 0;
    }



 

RapidJSON一个高效的C++库,用于处理JSON数据。如果你想将一个`Value`类型的JSON数据一个文件或其他来源读取,并将其写入到另一个JSON文件中,你可以按照以下步骤操作: 1. 首先,你需要包含`rapidjson/document.h`和`rapidjson/writer.h`头文件,因为`Value`是`document`类的一部分,而`writer`用于序列化JSON。 ```cpp #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" ``` 2. 使用`Document`类加载输入JSON: ```cpp rapidjson::Document dIn; // JSON读取对象 if (!dIn.ParseFromFile("input.json")) { // 检查解析是否成功 std::cerr << "Error parsing input file." << std::endl; return; } ``` 3. 创建一个`StringBuffer`和`Writer`对象,用于构建输出的字符串: ```cpp rapidjson::StringBuffer bufferOut; rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(bufferOut); // 设置美化输出 ``` 4. 将`Value`复制或转换到新的`Value`对象中,然后开始写入: ```cpp rapidjson::Value rootCopy(dIn); // 如果需要修改值,这里进行相应的操作 writer.StartObject(); // 写入开始对象 rootCopy.Accept(writer); // 将内容写入 writer.EndObject(); // 结束对象 // 现在,bufferOut中包含了序列化的JSON文本 ``` 5. 最后,将结果写入目标文件: ```cpp std::ofstream outFile("output.json"); outFile << bufferOut.GetString(); // 将缓冲区的内容写入文件 outFile.close(); ``` 如果一切顺利,你的数据应该已经从源文件成功地迁移到了输出文件中。注意,上述示例假设你已经有了有效的JSON结构,如果没有特定的数据操作需求,直接复制整个`Value`可能就是你需要的。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值