现在来一个实例解析类,直接就把解析JSON到QVariant去了。唯一不足的是没有搞错误处理,具体方法也请各位自行参考json-c的发行文档,这样比较方便叙述,STL或者Boost我都没有认真接触过,不方便写。

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

话说JSON在Web上应用得非常不错,XML虽然想法很好,但是冗长,解析又麻烦。而JSON作为Javascript的字符描述语言,根本不用手动解析,直接交给Javascript,Eval便可得到结果。而PHP 5.2 以上,更内置了JSON的解析函数,一个函数便把PHP的对象转换为JSON,比XML来得快得多、方便得多(话说PHP干对象的Serialize和Unserialize是它的强项  )。

今天本文就来说说在C和C++上如何来读取JSON。实际上解析JSON是比较简单的,难点在于读取。另外,以QT为例,这样比较方便叙述,STL或者Boost我都没有认真接触过,不方便写。

现在JSON解析库满天飞,没有必要再自己写个了,除非是商业程序  。我试过JsonCPP, QJson, Json-Spirit, jaula等C++的库。遇到总总问题,有不支持中文(UTF-8编码也不行)、不方便在Windows下编译、体积过于臃肿等毛病,最终的选择是C库json-c,因为Google看到一篇文章对JSON的各个C库的优点比较,说Json-C兼容性最好,而且支持中文(使用UTF-8)。

编译仍然不是很方便,需要使用configure和GCC。这样就需要MSYS或者Cygwin了,各位Windows大大需要编译的话,劳请各位自己Google,安装最基本的MSYS或者Cygwin,以便使用Bash。另外,MinGW也是必不可少的啦,因为要用GCC和Make嘛。

如若在C++下使用C的库,头文件需要特殊处理,解析JSON因为C编译器及C++编译器编译出来的中间代码的符号不一致,如若不经处理,最后在链接的时候定会出现找不到符号的问题。以下是C++的代码:

  1. #include <QString>
  2. #include <QList>
  3. #include <QMap>
  4. extern "C"{
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <json.h>
  8. #include <json_object.h>
  9. #include <json_tokener.h>
  10. }
  11. .....
  12. // 忽略上下文的其它代码,关注我们要的解析方法
  13. // 1) 解析数组
  14. char * json_string = " [ 10, 20, \"nice\" ] ";
  15. struct json_object *obj, *temp_obj;
  16. QList< QVariant > data;
  17. obj = json_tokener_parse( json_string ); /* 此时的Obj是一个Array */
  18. for(int i=0 ; i<json_object_array_length(obj) ; i++ ){
  19. temp_obj = json_object_array_get_idx(obj, i ); /* 获取数组的第 i 个元素,作为 temp_obj 保存 */
  20. switch( json_object_get_type( temp_obj ) {  /* 判断 temp_obj 的类型 */
  21. case json_type_string:  /* 若是字符串 */
  22. data.append( json_object_get_string(temp_obj) )
  23. break;
  24. case json_type_int: /* 若是整数 */
  25. data.append( json_object_get_in(temp_obj) )
  26. break;
  27. default: /* 其它的类型先不管了 */
  28. break;
  29. }
  30. }
  31. }
  32. // 2) 解析对象
  33. char * json_string = " { one: \"good\", \"two\":2 } "
  34. struct json_object *obj, *temp_obj;
  35. QMap< QString,QVariant > data;
  36. obj = json_tokener_parse( json_string );
  37. json_object_object_foreach( obj, key, value ){ // 这里的key和Value不需要提前声明。在宏里作者就给声明了 -_-|||
  38. switch( json_object_get_type( value ) {
  39. case json_type_string:  /* 若是字符串 */
  40. data.insert( key, json_object_get_string(value) )
  41. break;
  42. case json_type_int: /* 若是整数 */
  43. data.insert( key, json_object_get_in(value) )
  44. break;
  45. default: /* 其它的类型先不管了 */
  46. break;
  47. }
  48. ...
【责任编辑:苏越 TEL:(010)68476606】

更好更快更高效解析JSON说明的更多相关文章

  1. 让DB2跑得更快——DB2内部解析与性能优化

    让DB2跑得更快——DB2内部解析与性能优化 (DB2数据库领域的精彩强音,DB2技巧精髓的热心分享,资深数据库专家牛新庄.干毅民.成孜论.唐志刚联袂推荐!)  洪烨著 2013年10月出版 定价:7 ...

  2. vue3.0和2.0的区别,Vue-cli3.0于 8月11日正式发布,更快、更小、更易维护、更易于原生、让开发者更轻松

    vue3.0和2.0的区别Vue-cli3.0于 8月11日正式发布,看了下评论,兼容性不是很好,命令有不少变化,不是特别的乐观vue3.0 的发布与 vue2.0 相比,优势主要体现在:更快.更小. ...

  3. Mockplus更快更简单的原型设计

    更快更简单的原型设计 https://www.mockplus.cn/ Mockplus,更快更简单的原型设计工具.快速创建原型,一键拖拽创建交互,团队协作省事省力.微软.华为.东软.育碧.Oracl ...

  4. Microsoft Hyperlapse——让第一人称视频更快更流畅

    Hyperlapse--让第一人称视频更快更流畅" title="Microsoft Hyperlapse--让第一人称视频更快更流畅"> 职业摄影师Nick Di ...

  5. 比年轻更年轻,快看能否接棒B站?

    撰文 |懂懂 编辑 | 秦言 来源:懂懂笔记 背靠超新Z世代,快看能否接棒B站? 国漫什么时候能追上日漫? 国漫作者真能挣到钱吗? 国漫什么时候才能走向世界? 这是中国漫画从业者的"灵魂三问 ...

  6. 不妨试试更快更小更灵活Java开发框架Solon

    @ 目录 概述 定义 性能 架构 实战 Solon Web示例 Solon Mybatis-Plus示例 Solon WebSocket示例 Solon Remoting RPC示例 Solon Cl ...

  7. 玩转 .NET Core 3.0:逐浪CMS新版发布,建站更简单、网站更安全

    2019年11月11日,在大家都忙于网上体会“双11 ”的热闹气氛的时候,逐浪CMS开发者团队正在做着新版本发布的最后工作.此次更新是基本于 .NET Core 3.0开发,也是全国首个基于 .NET ...

  8. .NET 事件总线,简化项目、类库、线程、服务等之间的通信,代码更少,质量更好。‎

    Jaina .NET 事件总线,简化项目.类库.线程.服务等之间的通信,代码更少,质量更好.‎ 安装 Package Manager Install-Package Jaina .NET CLI do ...

  9. Android解析Json速度最快的库:json-smart

    场景描写叙述: 本文仅验证了在安卓环境下使用Json的Key作为反序列化条件的解析速度.结论是解析速度最快的不是阿里的fastjson,也不是Google的Gson,而是json-smart. And ...

随机推荐

  1. c++类的声明和对象的定义---10

    原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量:创建对象的过程也叫类的实例化. ...

  2. android之OptionMenu

    一.现在我给大家介绍两个不同版本的模拟器(2.3.3和4.0.3) 1.布局文件 (1)打开“res/layout/activity_main.xml”文件. 先看mian布局文件 <Relat ...

  3. 深入C#中get与set的详解(转)

    转自:http://www.jb51.net/article/37960.htm 释一:属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句.访问器声明可以包含 get 访问器或 se ...

  4. 论文笔记之: Hierarchical Convolutional Features for Visual Tracking

    Hierarchical Convolutional Features for Visual Tracking  ICCV 2015 摘要:跟卢湖川的那个文章一样,本文也是利用深度学习各个 layer ...

  5. Apache Shiro系列教程之三:Shiro的结构

    Shiro的设计目标是简化应用的安全管理工作.软件通常是以用户为基础设计的.也就是说,我们经常是根据用户是怎样和我们的软件交互的来设计相关的用户接口.比如,你可能会说"如果是已经登录的用户与 ...

  6. PNG格式小图标的CSS任意颜色赋色技术

    一.眼见为实 CSS可以修改图片的颜色,没错,可以,眼见为实!您可以狠狠地点击这里:png小图标CSS赋色demo 上面的不是很黑的是原始图标,是个PNG图片,下面这个是可以赋色的: 下面,我们随意选 ...

  7. ./configure,make,make install的作用(转)

    这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤. ./configure是用来检测你的安装平台的目标特征的.比如它会检测你是不是有CC或GCC,并不是需要CC或GCC ...

  8. 解决TalbleView头部或底部子控件不显示问题

    在自定义cell头部控件UITableViewHeaderFooterView(和自定义cell的方法几乎一样)时,出现了头部控件子控件不显示的问题. 注意和自定义cell的区别. .h文件 #imp ...

  9. C#:安装Windows服务,动态指定服务名及描述

    Installer.cs>> public Installer() { InitializeComponent(); /* 服务未注册前,System.Configuration.Conf ...

  10. MYSQL EXPLAIN 很慢的原因

    今天同事在查看一个SQL的执行计划的时候,EXPLAIN语句跑了2分钟.SQL命令类似: SELECT * FROM (SELECT USERID,COUNT(*) FROM TBNAME GROUP ...