主页 > 知识库 > 网络编程 > 其他 >

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

来源:织梦技术论坛 作者:佚名 发表于:2012-06-21 14:14  点击:
现在来一个实例解析类,直接就把解析JSON到QVariant去了。唯一不足的是没有搞错误处理,具体方法也请各位自行参考json-c的发行文档,这样比较方便叙述,STL或者Boost我都没有认真接触过,不方便写。 JSON(JavaScript Object Notation) 是一种轻量级的数据交换
现在来一个实例解析类,直接就把解析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文本进行详细介绍
  • 大致阐述JSON数据格式的编写与运行方式
  • 如何更好用一般的JS生成JSON数据简介
  • 几分钟教您扩展jQuery的Json技巧说明
  • 下载与学习JSON的类库的图记录


现在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
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
60
61
62
<pre class="brush:xml;toolbar:false;">#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; 
 
...</pre><p>
</p>

    有帮助
    (2)
    100%
    没帮助
    (0)
    0%