更好更快更高效解析JSON说明

开发
最近在用QT写一个小软件,途中遇到了解析JSON的问题,坎坷之路,总结出一些经验,一定要与大家分享一下。先介绍下JSON的使用。

现在来一个实例解析类,直接就把解析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我都没有认真接触过,不方便写。#t#

现在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++的代码:

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

2024-01-01 18:57:01

Code技巧符号

2024-10-15 10:47:12

2017-09-04 17:50:12

2019-04-19 08:18:37

神经网络数据图形

2010-01-06 14:24:40

Javascript解

2009-12-30 10:46:01

Ubuntu目标

2010-02-06 10:54:38

Android进程

2024-12-20 16:41:22

2010-02-02 13:59:11

Python编写

2020-10-22 10:17:27

敏捷性高级合伙人CIO

2016-09-18 20:19:01

LinuxVimGitHub

2017-12-21 14:36:10

大数据健身智慧

2018-05-08 14:58:07

戴尔

2015-01-26 10:38:53

企业级WLAN

2010-01-20 17:32:16

C++函数

2010-02-03 09:27:21

编写Python程序

2010-02-03 17:51:42

Ubuntu Linu

2010-01-06 14:19:47

JSON轻量级

2023-11-24 11:20:04

functoolsPython

2016-06-30 16:54:49

UCloud爱数云计算
点赞
收藏

51CTO技术栈公众号