一个递归搞定

无聊的时候练练手就写了一个 头文件什么的我就不贴了 demo程序是MFC写的

  1. void ParseObject(rapidjson::Value dc, CTreeCtrl * pTreeRoot,HTREEITEM hTreeHandle)
  2. {
  3. for (rapidjson::Value::ConstMemberIterator it = dc.MemberBegin(); it != dc.MemberEnd(); it++)
  4. {
  5. std::wstring strName = Ansi_To_Unicode(it->name.GetString());
  6. HTREEITEM pTmpObj = NULL;
  7. if (dc[it->name.GetString()].IsObject() || dc[it->name.GetString()].IsArray())
  8. {
  9. pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
  10. }
  11. else
  12. {
  13. strName += _T(":");
  14.  
  15. if (it->value.IsInt64())
  16. {
  17. strName += std::to_wstring(it->value.GetInt64());
  18. pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
  19. }
  20. else if (it->value.IsDouble())
  21. {
  22. strName += std::to_wstring(it->value.GetDouble());
  23. pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
  24. }
  25. else if (it->value.IsBool())
  26. {
  27. strName += std::to_wstring((int)it->value.GetBool());
  28. pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
  29. }
  30. else if (it->value.IsFloat())
  31. {
  32. strName += std::to_wstring(it->value.GetFloat());
  33. pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
  34. }
  35. else if (it->value.IsInt())
  36. {
  37. strName += std::to_wstring(it->value.GetInt());
  38. pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
  39. }
  40. else if (it->value.IsNumber())
  41. {
  42. strName += std::to_wstring(it->value.GetUint());
  43. pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
  44. }
  45. else if (it->value.IsNull())
  46. {
  47. strName += _T("");
  48. pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
  49. }
  50. else if (it->value.IsString())
  51. {
  52. strName += Ansi_To_Unicode(it->value.GetString());
  53. pTmpObj = pTreeRoot->InsertItem(strName.c_str(), hTreeHandle);
  54. }
  55. }
  56.  
  57. if (dc[it->name.GetString()].IsObject() && pTmpObj)
  58. {
  59. ParseObject(dc[it->name.GetString()].GetObjectW(), pTreeRoot, pTmpObj);
  60. }
  61. if (dc[it->name.GetString()].IsArray() && pTmpObj)
  62. {
  63. int index = ;
  64. for (auto &v : dc[it->name.GetString()].GetArray())
  65. {
  66. if (v.IsObject())
  67. {
  68. HTREEITEM pTmparr = pTreeRoot->InsertItem((strName + _T("[") + std::to_wstring(index) + _T("]")).c_str(), pTmpObj);
  69. if (pTmparr)
  70. ParseObject(v.GetObjectW(), pTreeRoot, pTmparr);
  71. }
  72. index++;
  73. }
  74. }
  75. }
  76. }
  77. void CtreeDemoDlg::OnBnClickedButton1()
  78. {
  79. CTreeCtrl * pTreeRoot = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
  80. if (!pTreeRoot)
  81. return;
  82. std::string strResult;
  83. CString buftext;
  84. GetDlgItemText(IDC_RICHEDIT21, buftext);
  85. strResult = Unicode_To_Ansi(buftext.GetBuffer());
  86. if (strResult.empty())return;
  87. //wstring strbuffer = Ansi_To_Unicode(strResult.c_str());
  88. rapidjson::Document dc;
  89. dc.Parse(strResult.c_str());
  90. if (!dc.IsObject())
  91. return;
  92. HTREEITEM pTreeObj = pTreeRoot->InsertItem(_T("object"));
  93. if (!pTreeObj)
  94. return;
  95. HTREEITEM pTmpObj = nullptr;
  96. ParseObject(dc.GetObjectW(), pTreeRoot, pTreeObj);
  97. return;
  98. }

效果图

使用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. @loj - 2434@ 「ZJOI2018」历史

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的 ...

  2. LeetCode58 Length of Last Word

    题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...

  3. 全文索引——CONTAINS 语法

    Like直接在数据据中查找可以查到所有所需记录但是会扫描整个表会影响性能CONTAINS是基于全文索引进行查询,查询结果受系统全文索引分词的方法影响查询结果会不全.Select * FROM A Wh ...

  4. HZOJ 旋转子段

    作者的正解: 算法一:对于30%的数据: 直接枚举区间直接模拟,时间复杂度O(N3). 算法二:对于60%的数据:枚举旋转中心点,然后再枚举旋转的端点, 我们可以用O(n)的预处理求前缀和记录固定点, ...

  5. laravel 实现微博第三方登陆

    https://blog.csdn.net/a12541254/article/details/79415550 1.安装 composer require socialiteproviders/we ...

  6. SCSS语法格式及编译调试

    一.SASS编译 Sass 的编译有多种方法: 命令编译 GUI工具编译 自动化编译 1.1 命令编译 1)单文件编译 sass <要编译的Sass文件路径>/style.scss:< ...

  7. angular ui 路由传参

    1. ui-sref.$state.go 的区别 ui-sref 一般使用在 <a>...</a>: $state.go('someState')一般使用在 controlle ...

  8. apply、call、bind方法调用

    ---恢复内容开始--- 首先这三个方法的作用都是用来改变this的值,而this的值一般有几种情况. 1.函数作为一个对象的一个方法来调用,此时this的值指向对象. var a={ v:0; f: ...

  9. 关于 FormData 和 URLSearchParams

    一.FormData FormData 接口提供了一种表示表单数据的键值对的构造方式,经过它的数据可以使用 XMLHttpRequest.send() 方法送出,本接口和此方法都相当简单直接.如果送出 ...

  10. CodeForces 620E"New Year Tree"(DFS序+线段树+状态压缩)

    传送门 •题意 给你一颗 n 个节点的树,每个节点被染上了颜色: 有 m 次操作,每次操作的类型有两种 1 v c : 将以 v 为根的子树的结点全部涂成 c 2 v : 询问以 v 为根的子树的结点 ...