开发工作中涉及JSON文件的解析/编码是不可避免的,象PHP/JAVA/C#等语言中都内置有非常方便的JSON操作类库,但C++自身没有提供这样的操作方法,因此不得不借助一些第三方库来完成JSON操作。之前使用过jsoncpp,感觉不是太好,对于一些含有特殊字符的json内容解析时还可能发生程序崩溃,后来接触到RadpidJSON,发现非常不错,据官方宣称是最快的JSON库,所以称之为"RAPID"。

下面是本人在工作中封装的工具函数,使用非常方便,能够满足大多数情况下JSON操作的需要,能够大节省我们的编码时间。

struct TStrMapVec

{

vector> vec_;

};

struct TJsonParseResult

{

public:

bool FindParam(const std::string& key)

{

std::string name(key);

std::transform(name.begin(), name.end(), name.begin(), ::tolower);

auto it = m_mapParams.find(name);

if (it != m_mapParams.end())

{

return true;

}

auto it1 = m_mapArray.find(name);

if (it1 != m_mapArray.end())

{

return true;

}

return false;

}

std::string GetParam(const std::string& key)

{

std::string name(key);

std::transform(name.begin(), name.end(), name.begin(), ::tolower);

std::string value;

auto it = m_mapParams.find(name);

if (it != m_mapParams.end())

{

value = it->second;

}

return value;

}

void GetArrayParam(const std::string& key, std::vector<:map>>& vecParams)

{

std::string name(key);

std::transform(name.begin(), name.end(), name.begin(), ::tolower);

auto it = m_mapArray.find(name);

if (it != m_mapArray.end())

{

vecParams = it->second.vec_;

}

}

void AddParam(const std::string& key, const std::string& value)

{

std::string name(key);

std::transform(name.begin(), name.end(), name.begin(), ::tolower);

m_mapParams[name] = value;

}

void AddArrayParam(const std::string& key, std::map<:string>& mapParams)

{

std::string name(key);

std::transform(name.begin(), name.end(), name.begin(), ::tolower);

m_mapArray[name].vec_.push_back(mapParams);

}

void RemoveParam(std::string name)

{

m_mapParams.erase(name);

m_mapArray.erase(name);

}

bool IsEmpty()

{

return m_mapParams.empty() && m_mapArray.empty();

}

public:

map m_mapParams;

map m_mapArray;

};

static void ParseJsonObj(const rapidjson::Value& jsonObj, TJsonParseResult& zjapiRes, string namePrefix = "")

{

if (jsonObj.IsNull()

|| jsonObj.IsObject() == false)

{

return;

}

for (auto it = jsonObj.MemberBegin(); it != jsonObj.MemberEnd(); ++it)

{

auto key = it->name.GetString();

const rapidjson::Value& jsonValue = it->value;

string name = namePrefix;

string value;

if (name.empty() == false)

{

name += ".";

}

name += key;

if (jsonValue.IsString()

|| jsonValue.IsNumber())

{

if (jsonValue.IsString())

{

value = jsonValue.GetString();

}

else if (jsonValue.IsInt())

{

value = to_string(jsonValue.GetInt());

}

else if (jsonValue.IsUint())

{

value = to_string(jsonValue.GetUint());

}

else if (jsonValue.IsInt64())

{

value = to_string(jsonValue.GetInt64());

}

else if (jsonValue.IsUint64())

{

value = to_string(jsonValue.GetUint64());

}

else if (jsonValue.IsDouble())

{

value = to_string(jsonValue.GetDouble());

}

zjapiRes.AddParam(name, value);

}

else if (jsonValue.IsArray())

{

//假定为数组时,数组元素只能是类似于{"a":1,"b":2}这样不再包含子数组

map mapParams;

for (size_t i = 0; i

{

const rapidjson::Value& arrItem = jsonValue[i];

if (arrItem.IsNull()

|| arrItem.IsObject() == false)

{

continue;

}

auto jsonText = std::move(JsonToString(arrItem));

mapParams["json"] = jsonText;

for (auto itItemMember = arrItem.MemberBegin(); itItemMember != arrItem.MemberEnd(); ++itItemMember)

{

auto itemMemberKey = itItemMember->name.GetString();

const rapidjson::Value& jsonItemMemberValue = itItemMember->value;

if (jsonItemMemberValue.IsString())

{

mapParams[itemMemberKey] = jsonItemMemberValue.GetString();

}

else if (jsonItemMemberValue.IsInt())

{

mapParams[itemMemberKey] = to_string(jsonItemMemberValue.GetInt());

}

else if (jsonItemMemberValue.IsUint())

{

mapParams[itemMemberKey] = to_string(jsonItemMemberValue.GetUint());

}

else if (jsonItemMemberValue.IsInt64())

{

mapParams[itemMemberKey] = to_string(jsonItemMemberValue.GetInt64());

}

else if (jsonItemMemberValue.IsUint64())

{

mapParams[itemMemberKey] = to_string(jsonItemMemberValue.GetUint64());

}

else if (jsonItemMemberValue.IsArray())

{

mapParams[itemMemberKey] = std::move(JsonToString(jsonItemMemberValue));

}

}

zjapiRes.AddArrayParam(name, mapParams);

}

}

else if (jsonValue.IsObject())

{

ParseJsonObj(jsonValue, zjapiRes, name);

}

}

}

//JSON解析工具函数

void ParseJson(const std::string& jsonRes, TJsonParseResult& jsonparseresult)

{

rapidjson::Document jsonDoc;

jsonDoc.Parse<0>(jsonRes.c_str());

if (jsonDoc.HasParseError())

{

rapidjson::ParseErrorCode code = jsonDoc.GetParseError();

return;

}

ParseJsonObj(jsonDoc, jsonparseresult);

}

比如对于json内容{"a":1,"b":2},调用ParseJson后,输出参数jsonparseresult的map中存在2个元素:

"a" => 1, "b" => 2

python isnumberic用法_NETASST技术博客相关推荐

  1. PYTHON字典dictionary用法laurentluce技术博客

    http://www.laurentluce.com/posts/python-dictionary-implementation/

  2. python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客

    python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客 python脚本监控网站状态 2013-01-09 09:21:02 标签:监控 python 原创作品,允许转载,转载时请 ...

  3. python之syslog学习 - 坏男孩 - 51CTO技术博客

    python之syslog学习 - 坏男孩 - 51CTO技术博客 python之syslog学习 - 坏男孩 - 51CTO技术博客 python之syslog学习 2010-04-22 17:47 ...

  4. python自我总结笔记、加上一些自己思考_写技术博客那点事(此篇文章 鼓励自己 多思考 多学习 多做 )...

    前言 写文章是一个短期收益少,长期收益很大的一件事情,人们总是高估短期收益,低估长期收益.往往是很多人坚持不下来,特别是写文章的初期,刚写完文章没有人阅读会有一种挫败感,影响了后期创作. 从某种意义上 ...

  5. 使用Python爬取CSDN历史博客文章列表,并生成目录

    使用Python爬取CSDN历史博客文章列表,并生成目录 这篇博客将介绍如何使用Python爬取CSDN历史博客文章列表,并生成目录. 2020年 2020年04月 cv2.threshold() 阈 ...

  6. 编写字符串反转函数 - 小小外星人的技术博客 - 博客频道 - CSDN.NET

    编写字符串反转函数 - 小小外星人的技术博客 - 博客频道 - CSDN.NET 编写字符串反转函数 分类: 笔试面试题 2010-11-07 20:47 863人阅读 评论(0) 收藏 举报 首先用 ...

  7. (2006, 'MySQL server has gone away') 错误解决 - dba007的空间 - 51CTO技术博客

    (2006, 'MySQL server has gone away') 错误解决 - dba007的空间 - 51CTO技术博客 (2006, 'MySQL server has gone away ...

  8. 最全的BAT Google等团队技术博客集合

    [转载 https://www.jianshu.com/p/7646721c0fc1] [转载请注明原文出处,谢谢!https://www.jianshu.com/p/7646721c0fc1] 前言 ...

  9. 从 0 开始搭建一个技术博客,私藏干货~

    2019独角兽企业重金招聘Python工程师标准>>> 技术博客的选型有很多种,如:博客园.CSDN.开源中国.简书.知乎等--都可以用来写文章,形成自己的技术博客. 上面的博客都是 ...

  10. Maven问题总结 - 3 - 技术改变生活商业成就梦想 - 51CTO技术博客

    Maven问题总结 - 3 - 技术改变生活商业成就梦想 - 51CTO技术博客 Maven问题总结 - 3 - 技术改变生活商业成就梦想 - 51CTO技术博客 Maven问题总结 - 3 2010 ...

最新文章

  1. python银行家算法代码_避免死锁的银行家算法C++程序实现
  2. [转]sqlplus中不能上下键选择前一条命令解决方法
  3. 单源最短路——dijkstra算法
  4. 我的技术博客在博客园落户了
  5. dynamic 仪表板_仪表板完成百万美元交易
  6. mysql8.0设置用户权限_mysql8.0建立用户授予权限报错解决方法
  7. C# 中 FindControl 方法及使用
  8. C# winFrom窗体设计问题-部分文件打不开窗体设计器 变成类.cs
  9. OpenCV绘制线、矩形、圆等基本几何形状
  10. 我坚决不能容忍_出轨坚决不能忍,3星座女对出轨0容忍,敢出轨就等着吧
  11. 《iOS 6核心开发手册(第4版)》——1.13节秘诀:从滚动视图中拖动
  12. asp.net银行账目管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目
  13. 推荐几款常用的Socks5代理软件
  14. 数据库实验四 视图实验
  15. AE MG动画脚本motion2 脚本使用方法学习笔记
  16. 基于单片机汽车防盗报警系统设计-单片机毕业课程设计
  17. 目前最为出色的Wii模拟器,可以在电脑上运行绝大多数Wii游戏,对低端配置完美支持,绝对的神器!
  18. ckplayer,超酷网页播放器,用于集成在网站中的播放器
  19. 关于联想拯救者Y7000/Y7000P电源显示0%的问题及解决办法
  20. mac要装anaconda吗_在Mac OS X上安装Anaconda

热门文章

  1. swagger 参数
  2. ArrayUtils
  3. pageHelper 分页插件使用
  4. ubuntu上如何安装mysql
  5. Spring入门第六课
  6. lucene中文分词搜索的核心代码
  7. AMD and CMD are dead之KMDjs内核之依赖分析
  8. 常见js表单验证方法(H5,layUI,amazeUI,vue)
  9. JVM监控及诊断工具命令行篇之jhat
  10. 面试题之请描述一下Java类加载过程