一个递归搞定

无聊的时候练练手就写了一个 头文件什么的我就不贴了 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数据解析到树状结构的更多相关文章

  1. js 每日一更(数组转换成前端更容易解析的树状结构)

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  2. EasyUI + ajax + treegrid/datagrid 接收 json 数据,显示树状/网状表结构

    最后一更了,时间间隔有点久了~~ EasyUI作为一个成熟的前端框架,封装了ajax,对于数据的处理配合datagrid组件的使用,使其非常适合后台管理界面的开发(目前来说界面有点过时了). 通过aj ...

  3. JSON数据解析 基础知识及链接收集

    JSON数据解析学习 JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式. JSON 是存储和交换文本信息的语法.类似 XML.但是JSON 比 ...

  4. 浅谈JSON数据解析方法

    JSON数据解析 JSON是什么?? 如何把JSON数据解析出来 如何把一个字典转换为JSON JSON详细介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交 ...

  5. JSON数据解析(转)

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android ...

  6. JSON数据解析(GSON方式) (转)

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 在上一篇博文<Andro ...

  7. iOS - JSON 数据解析

     iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...

  8. iOS高级编程之XML,JSON数据解析

    解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...

  9. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

随机推荐

  1. Oracle函数——TO_DATE

    TO_DATE 含义:将具有固定格式的字符串类型的数据转化为相对应的Date类型数据,官网解释如下图   使用方法 TO_DATE("需要转换的字符串","日期格式&qu ...

  2. python中'0b111'中的b 是什么意思

    https://zhidao.baidu.com/question/987330764742072579.html binary,二进制的意思

  3. 洛谷 1372 又是毕业季I

    题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定 ...

  4. 5款实用的jQuery验证码插件

    效果图 文档结构 HTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  5. js后端返回一个时间戳,用原生怎么对时间进行格式化?

    function fn(time) { var date = new Date(time); var len = time.toString().length; // 时间戳不足13位则在后面加零 i ...

  6. 百度小程序富文本bdParse遇到的坑

    百度开发工具能正常显示文章图文详情, web浏览也可以, app浏览就不行, 审核说兼容性问题, 都不是, 后来发现是后台传输的数据问题, 不能用json_encode()返回数据

  7. 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 ...

  8. 日历价差(calendar spread)

    日历价差(calendar spread) 是指投资者买进到期日较远的期权 (简称远期期权),同时又卖出相同行权价格.相同数量但到期日较近的期权(简称近期期权),赚取两个不同期权隐含波动率的差价或者其 ...

  9. [转]MySQL常用查询

    单表查询 ①查询所有     * mysql> select * from student; ②查询选中字段记录 mysql> select s_name from student; ③条 ...

  10. webpack学习(二)初识打包配置

    前言:webpack打包工具让整个项目的不同文件夹相互关联,遵循我们想要的规则.想 .vue文件, .scss文件浏览器并不认识,因此webpage暗中做了很多转译,编译等工作. 事实上,如果我们在没 ...