`
7090
  • 浏览: 278561 次
  • 性别: 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 3.x游戏开发实战pdf含目录

    总的来说,《Cocos2d-x 3.x游戏开发实战》是一本全面覆盖Cocos2d-x 3.x开发技术的指南,它不仅教授基本概念和技术,还通过实例深入解析游戏开发的各个层面。无论你是初学者还是有一定经验的开发者,这本书都能提供...

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

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

    cocos2d-x-3.13.1 spine3.6.zip

    Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,同时支持Lua和JavaScript等多种脚本语言,为开发者提供了高效、跨平台的游戏开发解决方案。在3.13.1版本中,Cocos2d-x对Spine动画引擎的集成进行了更新,这...

    cocos2d-x windows vs2010配置

    本文将详细介绍如何在 Windows 环境下使用 Visual Studio 2010 配置 Cocos2d-x 游戏引擎。Cocos2d-x 是一个跨平台的游戏引擎,可以在多种平台上运行,包括 Windows、Mac OS X、iOS、Android 等。 一、下载和安装 ...

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

    2. **C++核心**:3.8版本的cocos2d-x使用C++作为主要开发语言,保证了性能和灵活性,同时也通过tolua++和jsb提供Lua和JavaScript接口。 3. **强大的渲染引擎**:支持精灵、批处理、骨骼动画、物理引擎等多种图形...

    Cocos2d-x实战:C++卷(2版)源代码

    1. **场景(Scene)与层(Layer)管理**:Cocos2d-x使用场景和层的概念组织游戏画面。场景是一个完整的屏幕视图,而层则是场景中的一个可独立管理的部分,多个层可以组合成一个场景。 2. **精灵(Sprite)与动画**...

    cocos2d-x_v3.16安装及环境变量配置文档

    cocos2d-x 是一个开源的游戏开发框架,使用 C++ 语言编写,支持多平台发布,包括 iOS、Android、Windows、macOS、Linux 和 Web。cocos2d-x v3.16 是该框架的一个版本号,本文档主要介绍了该版本的安装流程以及环境...

    cocos2d-x-3.1.zip

    12. **扩展与插件**:社区提供的各种扩展库和插件,如社交网络集成、广告支持、IAP(应用内购买)等,丰富了Cocos2d-x的功能。 13. **工具集**:包含了一个完整的工具链,如Cocos Studio用于界面设计,Cocos ...

    cocos2d-x 动画工具 Flash2Cocos2d-x 1.3

    在移动游戏开发领域,cocos2d-x是一款广泛使用的开源游戏引擎,以其高效、跨平台的特性深受开发者喜爱。而Flash2Cocos2d-x则是一个专为cocos2d-x设计的动画工具,它使得开发者能够将Flash内容轻松地转换为可以在...

    Cocos2d-x实战C++卷关东升著完整版pdf

    《Cocos2d-x实战C++卷》是关东升所著的一本深入探讨Cocos2d-x游戏引擎开发的专业书籍。Cocos2d-x是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言为主要编程...

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

    《Cocos2d-x实战 JS卷 Cocos2d-JS开发》是一本深入探讨Cocos2d-x游戏引擎JavaScript版本使用的专业书籍。Cocos2d-x是全球范围内广泛采用的游戏开发框架,尤其适用于2D游戏的制作,而Cocos2d-JS则是其JavaScript接口...

    cocos2d-x 3.0

    在游戏开发领域,cocos2d-x是一款广泛使用的开源2D游戏引擎,尤其在移动平台上的应用非常广泛。cocos2d-x 3.0版本带来了许多性能优化和新特性,使得开发者能够更高效地创建游戏。本篇文章将深入探讨cocos2d-x 3.0中...

    Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整

    3. Cocos2d-JS开发:这里强调的是使用Cocos2d-x框架结合JavaScript语言进行开发的过程。由于Cocos2d-x支持多种编程语言(包括C++、JavaScript和Lua),Cocos2d-JS意味着开发者可以采用JavaScript来构建游戏项目。 4...

    cocos2d-x-2.1.4.rar

    2. C++ 基础:cocos2d-x 使用C++作为主要编程语言,同时提供了Python、JavaScript等语言的绑定,满足不同开发者的需求。 3. 图形渲染:框架内置了基于OpenGL的图形渲染引擎,提供2D图形绘制、动画处理等功能,使...

    cocos2d-x-2.1.5

    cocos2d-x-2.1.5

    Cocos2d-x实战 JS卷

    2. **JavaScript绑定**:Cocos2d-x如何将C++底层库与JavaScript结合,提供JSB(JavaScript Bindings),让开发者能够使用JavaScript编写游戏逻辑。 3. **图形渲染**:学习如何使用Cocos2d-x的绘图API,包括纹理、...

    cocos2d-x API中文文档

    cocos2d-x是一个基于MIT许可证的开源游戏引擎,它以快速、简单且功能强大的特性闻名,允许开发者使用C++、Lua和JavaScript进行跨平台开发,支持包括iOS、Android、Windows Phone、Blackberry以及Tizen在内的多个平台...

    cocos2d-x实战 c++卷教程及完整源码

    cocos2d-x实战 c++卷教程及完整源码下载,使用最新cocos2d-x-3.14版本,在xcode7.3上已编译通过。 解决相关问题 1、解决源程序在高版本上无法编译问题 2、解决源程序中文注释部分,xcode上显示乱码问题 3、根据书籍...

    cocos2d-x源码素材

    【cocos2d-x源码素材】是一套用于学习cocos2d-x游戏开发的代码资源,它在Windows平台上使用Visual Studio 2010进行编译并通过了测试。这个资源包涵盖了多个重要的游戏开发技术,包括碰撞检测、瓦片地图(Tile Map)...

Global site tag (gtag.js) - Google Analytics