一个递归搞定

无聊的时候练练手就写了一个 头文件什么的我就不贴了 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. C# Find vs FirstOrDefault

    本文告诉大家,在获得数组第一个元素时,使用哪个方法性能更高. 需要知道,两个方法都是 Linq 的方法,使用之前需要引用 Linq .对于 List 等都是继承可枚举Enumerable这时获取第一个 ...

  2. console.log详细介绍

    console.log详细介绍 效果图: 代码如下: console.log("%c hello world!:http://www.baidu.com","color: ...

  3. OpenStack组件系列☞glance搭建

    第一步:glance关于数据库的操作 mysql -u root -p #登入数据库 CREATE DATABASE glance; #新建库keystone GRANT ALL PRIVILEGES ...

  4. day6_python之json序列化和反序列化

    json作用:用来保存当前状态 1.使用json.dumps序列化把dic字典存到文件中 dic={'name':'egon','age':18} print(json.dumps(dic)) #得到 ...

  5. CentOs7 使用iptables开启关闭端口

    介绍 iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分 iptables文件设置路径:命令:vim /etc/sysconfig/iptables-config 注 ...

  6. 字符串编辑距离(Edit Distance)

    一.问题描述定义字符串编辑距离(Edit Distance),是俄罗斯科学家 Vladimir Levenshtein 在 1965 年提出的概念,又称 Levenshtein 距离,是指两个字符串之 ...

  7. POJ2185 Milking Grid 题解 KMP算法

    题目链接:http://poj.org/problem?id=2185 题目大意:求一个二维的字符串矩阵的最小覆盖子矩阵,即这个最小覆盖子矩阵在二维空间上不断翻倍后能覆盖原始矩阵. 题目分析:next ...

  8. Java反射机制(三):调用对象的私有属性和方法

    一. 通过反射调用类中的方法 在正常情况下,得到类的对象后,我们就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚地知道要调用的方法是什么,之后通过Class类中的getMethod方法,可 ...

  9. Attention is all your need 谷歌的超强特征提取网络——Transformer

    过年放了七天假,每年第一件事就是立一个flag——希望今年除了能够将技术学扎实之外,还希望能够将所学能够用来造福社会,好像flag立得有点大了.没关系,套用一句电影台词为自己开脱一下——人没有梦想,和 ...

  10. 2018-6-11-WPF-Frame-的-DataContext-不能被-Page-继承

    title author date CreateTime categories WPF Frame 的 DataContext 不能被 Page 继承 lindexi 2018-06-11 10:48 ...