`
7090
  • 浏览: 273407 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)cocos2d-x解析json(使用libjson库)

 
阅读更多
cocos2d-x很好,扩展性很好,但是其第三方库还不是很成熟,正如王哲所说,需要我们自己寻找,比如json解析和格式化。



我们的网络部分需要用到json,网络部分用的比较多的就是json,毕竟很轻量级么。。。上午我看到cocos2d-x论坛里关于json的第三方库有人提到了两个,一个是jsoncpp,一个是libjson,我上午首选的是jsoncpp,看其编译过程,是比较复杂的,我耐着性子又下了scons(编译器),编是编出来了,可是在iphone上会报link的错,不知其解,在Mac app中使用,正常。。。擦,原来是Mac是64位的,而iphone需要的是32位库的,又是各种找答案,终于在其官网的wiki上找到解答-------在Mac 64位上编出32位库的方法,试了,发现编不过去,好像是gcc版本的原因,再看下面的warning,上面说对Mac的支持就是不怎么样!好吧,我承认它不是跨iphone和android的最佳选择了。(在ubuntu上编译很轻松,没问题的,应该android上没问题),于是下午我就转向了libjson。



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

JSON建构有两种结构:

  1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
  2.值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
(ps:这两段是从百度百科上copy的,但是json的第2种结构很重要,是人们常常忽视的)



2.编译
论坛里也有人提问过libjson怎么用,王哲给出的答案是直接copy源码到工程里,想必没有太复杂的编译参数,环境之类的障碍,于是我就copy了,编译,没错!工程如图

(copy了libjson下的Source,Dependencies目录和JSONOptions.h,libjson.h)

(PS: 只所以把光标放在JSONOptions.h上,是因为它很邪恶,几个宏和其开关的用法,源码竟然还有个bug。。。)



3.用法
libjson为我们提供了两套接口,一套c的,一套c++的,在其目录的Getting Started目录下,至于选择就因人喜好了!


(1)简单写法:
JSONNODE *n = json_new(JSON_NODE);  
    json_push_back(n, json_new_i("number", 88));  
    json_push_back(n, json_new_a("string", "oneRain"));  
    json_push_back(n, json_new_a("charactor", "中文"));  
      
    json_char *jc = json_write_formatted(n);  
    CCLOG("json: %s", jc);  
    json_free(jc);  
    json_delete(n);

输出结果:


(2)简单读法:
读取就需要一个简单的解析过程了,当然也可以没有,如果没有键的话

void ParseJSON(JSONNODE *n)  
{  
    if (n == NULL){  
        printf("Invalid JSON Node1\n");  
        return;  
    }  
      
    JSONNODE_ITERATOR i = json_begin(n);  
    while (i != json_end(n)){  
        if (*i == NULL){  
            printf("Invalid JSON Node2\n");  
            return;  
        }  
          
        // recursively call ourselves to dig deeper into the tree  
        if (json_type(*i) == JSON_ARRAY || json_type(*i) == JSON_NODE){  
            ParseJSON(*i);  
        }  
          
        // get the node name and value as a string  
        json_char *node_name = json_name(*i);  
          
        // find out where to store the values  
        if (strcmp(node_name, "number") == 0){  
            json_int_t node_value = json_as_int(*i);  
            CCLOG("%d", node_value);  
        }  
        else if (strcmp(node_name, "string") == 0){  
            json_char *node_value = json_as_string(*i);  
            CCLOG("%s", node_value);  
            json_free(node_value);  
        }  
        else if (strcmp(node_name, "charactor") == 0)  
            CCLOG("%s", json_as_string(*i));  
          
        // cleanup and increment the iterator  
        json_free(node_name);  
        ++i;  
    }  
}

调用过程
char *json = "{\"number\":88,\"string\":\"oneRain\",\"charactor\":\"汉字\"}";  
    JSONNODE *nr = json_parse(json);  
    ParseJSON(nr);  
    json_delete(nr);

结果如图:

(3)json数组
很多时候我们需要json格式来存储数组,有可能是对象的数组,也可能是基本变量的数组,如果是对象数组的话,就需要在“简单读法”中的ParseJSON方法中添加一些对对象的申请和对链表的操作才能完成你想要的数据结构!

当然另一种比较常用的用法是:只有“值”,没有“键”的数组,比如 ["value1","value2","value3"],这种格式是常用于socket链接中与服务器通信的,下面就分别写一个解析和格式化的两种方式:

a.解析
当然还是需要一个解析的函数用来输出和递归用的
void parseArrJSON(JSONNODE *n)  
{  
    if (n == NULL)  
    {  
        CCLOG("Invalid JSON Node\n");  
        return;  
    }  
      
    // Parser  
    JSONNODE_ITERATOR it = json_begin(n);  
    while (it != json_end(n)) {  
        if (*it == NULL) {  
            CCLOG("Invalid JSON Node\n");  
            return;  
        }  
          
        if (json_type(*it) == JSON_ARRAY || json_type(*it) == JSON_NODE) {  
            parseArrJSON(*it);  
        }  
        else {  
            // 如果只是值没有键,则只需要获取即可  
            json_char *value = json_as_string(*it);  
            CCLOG("%s", value);  
            json_free(value);  
        }  
          
        ++it;  
    }  
      
}  

用法很简单
char *arrJson = "[\"value1\",\"value2\",\"value3\"]";  
    JSONNODE *an = json_parse(arrJson);  
    parseArrJSON(an);  
    json_delete(an);

b.格式化
也就是拼接json字符串了
JSONNODE *arrn = json_new(JSON_ARRAY);  
    json_set_name(n, NULL);  
    json_push_back(n, json_new_a(NULL, "one"));  
    json_push_back(n, json_new_a(NULL, "汉字"));  
    json_push_back(n, json_new_i(NULL, 999999));  
      
    json_char *arrjc = json_write(arrn);  
      
    CCLOG("Json: %s, %d", arrjc, strlen(jc));

需要注意的是如果不想要“键”,则将对应参数设置为NULL,对象中不能这样做,数组中可以


特别PS:如果希望汉字原样输出,而不转化成utf-8编码格式,需要将JSONOptions.h中的宏关闭
#define JSON_ESCAPE_WRITES


5-24记录:libjson中判断结点类型c方法json_type(const void *node)

已定义类型
#define JSON_NULL '\0'  
#define JSON_STRING '\1'  
#define JSON_NUMBER '\2'  
#define JSON_BOOL '\3'  
#define JSON_ARRAY '\4'  
#define JSON_NODE '\5'  


原文:http://blog.csdn.net/onerain88/article/details/7595563

分享到:
评论

相关推荐

    Cocos2d-x 2.2.x Json解析

    Cocos2d-x 2.2.x Json解析Demo 无需引入jsoncpp库 相关博文地址:http://blog.csdn.net/u012945598/article/details/17398925

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    cocos2d-x-2.1.5

    cocos2d-x-2.1.5

    cocos2d-x事件类

    在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...

    大富翁手机游戏开发实战基于Cocos2d-x3.2引擎

    资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...

    Cocos2d-x高级开发教程

    Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...

    cocos2d-x实战项目

    cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...

    cocos2d-x-3.2旧版引擎下载

    cocos2d-x-3.2下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656

    Cocos2D-X游戏开发技术精解

     《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    经典版本 方便下载 源码 旧版本 3.8 官网找不到了 cocos2d-x-3.8.zip

    精通COCOS2D-X游戏开发 基础卷_2016.4-P399-13961841.pdf

    精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发

    cocos2d-x-3.0 类图

    这是我重新弄的cocos2d-x-3.0的类图.之前别人兄台弄的,有些不全面,有些地方错误.我这个可以说是最新的了.每个类添加了中文的详细注解,同时也添加了中文的类名称翻译.这样对cocos2d-x-3.0的框架比较好上手. 有兴趣的...

    Cocos2D-X游戏开发技术精解.pdf

    《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如何建立跨平台的开发环境;引擎的核心模块——渲染框架;如何实现动态画面和...

    Cocos2d-x 3.x游戏开发实战pdf含目录

    Cocos2d-x 3.x游戏开发实战pdf含目录,内容详细,强烈推荐给大家。

    cocos2d-x windows vs2010配置

    Cocos2d-x windows vs2010 配置图文详解

    Cocos2d-x游戏编程——C++篇 .iso

    Cocos2d-x游戏编程——C++篇(电子工业出版社,徐飞 著)书本配套的光盘代码,

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    Cocos2d-x实战 JS卷 Cocos2d-JS开发 PDF 电子书完整版本

    cocos2d-x 动画工具 Flash2Cocos2d-x 1.3

    cocos2d-x 动画工具 Flash2Cocos2d-x 1.3

    cocos2d-x 3.0

    cocos2d-x 3.0 人物行走 . 包里有代码和 图片资源.

    Cocos2d-x-3.x游戏开发之旅

    Cocos2d-x-3.x游戏开发之旅-钟迪龙著 全新pdf版和附书代码(代码为工程文件,可复制) 附带目录标签

Global site tag (gtag.js) - Google Analytics