使用rapidjson把文本json数据解析到树状结构
一个递归搞定
无聊的时候练练手就写了一个 头文件什么的我就不贴了 demo程序是MFC写的
void ParseObject(rapidjson::Value dc, CTreeCtrl * pTreeRoot,HTREEITEM hTreeHandle)
{
for (rapidjson::Value::ConstMemberIterator it = dc.MemberBegin(); it != dc.MemberEnd(); it++)
{
std::wstring strName = Ansi_To_Unicode(it->name.GetString());
HTREEITEM pTmpObj = NULL;
if (dc[it->name.GetString()].IsObject() || dc[it->name.GetString()].IsArray())
{
pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
}
else
{
strName += _T(":"); if (it->value.IsInt64())
{
strName += std::to_wstring(it->value.GetInt64());
pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
}
else if (it->value.IsDouble())
{
strName += std::to_wstring(it->value.GetDouble());
pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
}
else if (it->value.IsBool())
{
strName += std::to_wstring((int)it->value.GetBool());
pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
}
else if (it->value.IsFloat())
{
strName += std::to_wstring(it->value.GetFloat());
pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
}
else if (it->value.IsInt())
{
strName += std::to_wstring(it->value.GetInt());
pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
}
else if (it->value.IsNumber())
{
strName += std::to_wstring(it->value.GetUint());
pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
}
else if (it->value.IsNull())
{
strName += _T("");
pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
}
else if (it->value.IsString())
{
strName += Ansi_To_Unicode(it->value.GetString());
pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
}
} if (dc[it->name.GetString()].IsObject() && pTmpObj)
{
ParseObject(dc[it->name.GetString()].GetObjectW(), pTreeRoot, pTmpObj);
}
if (dc[it->name.GetString()].IsArray() && pTmpObj)
{
int index = ;
for (auto &v : dc[it->name.GetString()].GetArray())
{
if (v.IsObject())
{
HTREEITEM pTmparr = pTreeRoot->InsertItem((strName + _T("[") + std::to_wstring(index) + _T("]")).c_str(), pTmpObj);
if (pTmparr)
ParseObject(v.GetObjectW(), pTreeRoot, pTmparr);
}
index++;
}
}
}
}
void CtreeDemoDlg::OnBnClickedButton1()
{
CTreeCtrl * pTreeRoot = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
if (!pTreeRoot)
return;
std::string strResult;
CString buftext;
GetDlgItemText(IDC_RICHEDIT21, buftext);
strResult = Unicode_To_Ansi(buftext.GetBuffer());
if (strResult.empty())return;
//wstring strbuffer = Ansi_To_Unicode(strResult.c_str());
rapidjson::Document dc;
dc.Parse(strResult.c_str());
if (!dc.IsObject())
return;
HTREEITEM pTreeObj = pTreeRoot->InsertItem(_T("object"));
if (!pTreeObj)
return;
HTREEITEM pTmpObj = nullptr;
ParseObject(dc.GetObjectW(), pTreeRoot, pTreeObj);
return;
}
效果图


使用rapidjson把文本json数据解析到树状结构的更多相关文章
- js 每日一更(数组转换成前端更容易解析的树状结构)
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...
- EasyUI + ajax + treegrid/datagrid 接收 json 数据,显示树状/网状表结构
最后一更了,时间间隔有点久了~~ EasyUI作为一个成熟的前端框架,封装了ajax,对于数据的处理配合datagrid组件的使用,使其非常适合后台管理界面的开发(目前来说界面有点过时了). 通过aj ...
- JSON数据解析 基础知识及链接收集
JSON数据解析学习 JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式. JSON 是存储和交换文本信息的语法.类似 XML.但是JSON 比 ...
- 浅谈JSON数据解析方法
JSON数据解析 JSON是什么?? 如何把JSON数据解析出来 如何把一个字典转换为JSON JSON详细介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交 ...
- JSON数据解析(转)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android ...
- JSON数据解析(GSON方式) (转)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 在上一篇博文<Andro ...
- iOS - JSON 数据解析
iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...
- iOS高级编程之XML,JSON数据解析
解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...
- Android学习笔记之JSON数据解析
转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...
随机推荐
- Oracle函数——TO_DATE
TO_DATE 含义:将具有固定格式的字符串类型的数据转化为相对应的Date类型数据,官网解释如下图 使用方法 TO_DATE("需要转换的字符串","日期格式&qu ...
- python中'0b111'中的b 是什么意思
https://zhidao.baidu.com/question/987330764742072579.html binary,二进制的意思
- 洛谷 1372 又是毕业季I
题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定 ...
- 5款实用的jQuery验证码插件
效果图 文档结构 HTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- js后端返回一个时间戳,用原生怎么对时间进行格式化?
function fn(time) { var date = new Date(time); var len = time.toString().length; // 时间戳不足13位则在后面加零 i ...
- 百度小程序富文本bdParse遇到的坑
百度开发工具能正常显示文章图文详情, web浏览也可以, app浏览就不行, 审核说兼容性问题, 都不是, 后来发现是后台传输的数据问题, 不能用json_encode()返回数据
- Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory
遇到问题 在服务器上运行 nexus 出现Native memory allocation (mmap) failed to map 838860800 bytes for committing re ...
- 日历价差(calendar spread)
日历价差(calendar spread) 是指投资者买进到期日较远的期权 (简称远期期权),同时又卖出相同行权价格.相同数量但到期日较近的期权(简称近期期权),赚取两个不同期权隐含波动率的差价或者其 ...
- [转]MySQL常用查询
单表查询 ①查询所有 * mysql> select * from student; ②查询选中字段记录 mysql> select s_name from student; ③条 ...
- webpack学习(二)初识打包配置
前言:webpack打包工具让整个项目的不同文件夹相互关联,遵循我们想要的规则.想 .vue文件, .scss文件浏览器并不认识,因此webpage暗中做了很多转译,编译等工作. 事实上,如果我们在没 ...