python isnumberic用法_NETASST技术博客
开发工作中涉及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技术博客相关推荐
- PYTHON字典dictionary用法laurentluce技术博客
http://www.laurentluce.com/posts/python-dictionary-implementation/
- python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客
python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客 python脚本监控网站状态 2013-01-09 09:21:02 标签:监控 python 原创作品,允许转载,转载时请 ...
- python之syslog学习 - 坏男孩 - 51CTO技术博客
python之syslog学习 - 坏男孩 - 51CTO技术博客 python之syslog学习 - 坏男孩 - 51CTO技术博客 python之syslog学习 2010-04-22 17:47 ...
- python自我总结笔记、加上一些自己思考_写技术博客那点事(此篇文章 鼓励自己 多思考 多学习 多做 )...
前言 写文章是一个短期收益少,长期收益很大的一件事情,人们总是高估短期收益,低估长期收益.往往是很多人坚持不下来,特别是写文章的初期,刚写完文章没有人阅读会有一种挫败感,影响了后期创作. 从某种意义上 ...
- 使用Python爬取CSDN历史博客文章列表,并生成目录
使用Python爬取CSDN历史博客文章列表,并生成目录 这篇博客将介绍如何使用Python爬取CSDN历史博客文章列表,并生成目录. 2020年 2020年04月 cv2.threshold() 阈 ...
- 编写字符串反转函数 - 小小外星人的技术博客 - 博客频道 - CSDN.NET
编写字符串反转函数 - 小小外星人的技术博客 - 博客频道 - CSDN.NET 编写字符串反转函数 分类: 笔试面试题 2010-11-07 20:47 863人阅读 评论(0) 收藏 举报 首先用 ...
- (2006, 'MySQL server has gone away') 错误解决 - dba007的空间 - 51CTO技术博客
(2006, 'MySQL server has gone away') 错误解决 - dba007的空间 - 51CTO技术博客 (2006, 'MySQL server has gone away ...
- 最全的BAT Google等团队技术博客集合
[转载 https://www.jianshu.com/p/7646721c0fc1] [转载请注明原文出处,谢谢!https://www.jianshu.com/p/7646721c0fc1] 前言 ...
- 从 0 开始搭建一个技术博客,私藏干货~
2019独角兽企业重金招聘Python工程师标准>>> 技术博客的选型有很多种,如:博客园.CSDN.开源中国.简书.知乎等--都可以用来写文章,形成自己的技术博客. 上面的博客都是 ...
- Maven问题总结 - 3 - 技术改变生活商业成就梦想 - 51CTO技术博客
Maven问题总结 - 3 - 技术改变生活商业成就梦想 - 51CTO技术博客 Maven问题总结 - 3 - 技术改变生活商业成就梦想 - 51CTO技术博客 Maven问题总结 - 3 2010 ...
最新文章
- python银行家算法代码_避免死锁的银行家算法C++程序实现
- [转]sqlplus中不能上下键选择前一条命令解决方法
- 单源最短路——dijkstra算法
- 我的技术博客在博客园落户了
- dynamic 仪表板_仪表板完成百万美元交易
- mysql8.0设置用户权限_mysql8.0建立用户授予权限报错解决方法
- C# 中 FindControl 方法及使用
- C# winFrom窗体设计问题-部分文件打不开窗体设计器 变成类.cs
- OpenCV绘制线、矩形、圆等基本几何形状
- 我坚决不能容忍_出轨坚决不能忍,3星座女对出轨0容忍,敢出轨就等着吧
- 《iOS 6核心开发手册(第4版)》——1.13节秘诀:从滚动视图中拖动
- asp.net银行账目管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目
- 推荐几款常用的Socks5代理软件
- 数据库实验四 视图实验
- AE MG动画脚本motion2 脚本使用方法学习笔记
- 基于单片机汽车防盗报警系统设计-单片机毕业课程设计
- 目前最为出色的Wii模拟器,可以在电脑上运行绝大多数Wii游戏,对低端配置完美支持,绝对的神器!
- ckplayer,超酷网页播放器,用于集成在网站中的播放器
- 关于联想拯救者Y7000/Y7000P电源显示0%的问题及解决办法
- mac要装anaconda吗_在Mac OS X上安装Anaconda