一个递归搞定

无聊的时候练练手就写了一个 头文件什么的我就不贴了 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. Knative 初体验:Eventing Hello World

    作者 | 阿里云智能事业群高级开发工程师 元毅 基于事件驱动是Serveless的核心功能之一,通过事件驱动服务,满足了用户按需付费(Pay-as-you-go)的需求.在之前的文章中我们介绍过 Kn ...

  2. day6_python之configparser_模块

    configparser_模块是为了解析.ini文件的配置 a.ini [xiechao] name=xiechao age=18 is_admin=True salary=1000000.12 [x ...

  3. Eclipse里编辑代码,进度条出现“Remote System Explorer Operation”解决方法

    Eclipse里编辑代码,进度条出现"Remote System Explorer Operation",导致Eclipse有卡顿. 解决方法: Eclipse -> Pre ...

  4. asp.net mvc获取路由参数

    学习了mvc有一段时间了,本以为直接可以通过request对象直接获取路由参数呢,后来实验了一下发现想错了,mvc有专门获取路由参数的方式,在不同的地方,获取路由参数的方式也不一样,这里分别说一下,在 ...

  5. web与原生交互+活动

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Netty进行文件传输

    本次是利用TCP在客户端发送文件流,服务端就接收流,写入相应的文件. 实验的源文件是一个图片,假设地址是D:\\Koala.jpg,接收保存后的图片为D:\\test.jpg 原理就是将文件读取成by ...

  7. phpStudy中升级MySQL版本到5.7.17的方法步骤

    http://www.jb51.net/article/120263.htm 前言 今天在工作发现一个错误,在往本地导数据表的时候老是报错: ? 1 [Err] 1294 - Invalid ON U ...

  8. P1075 语句解析

    题目描述 一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 3 个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,每条赋值语句的格式是 [变量]:=[变量或一位整数]; ...

  9. java的四种代码块

    用{}括起来的称为代码块: 普通代码块:类中方法的方法体 构造代码块:类中{}直接括起来的语句,每次创建对象都会被调用,先于构造函数执行 静态代码块:类中static{}括起来的语句,只执行一次,先于 ...

  10. 装饰器&偏函数与作用域与异常处理与文件读写

    装饰器 概念:是一个闭包,把一个函数当做参数返回一个替代版的函数,本质上就是一个返回函数的函数 简单的装饰器 def func1(): print("sunck is a good man& ...