cocos2d-x把json数据解析到数组或字典中(libjson库)
以前在cocos2d-x项目中用到json解析,集成了libjson库后发现网上提供的解析方法大多是在解析过程中取得值,并没有将解析结果有效的保存起来,于是摸索一番,把解析结果根据数据格式存到数组或字典当中。
不敢独享,代码奉上:
using namespace std;
void JsonUtil:: parseArrJSON(JSONNODE *n,CCObject **obj)
{
if (n == NULL)
{
CCLOG("Invalid JSON Node\n");
return;
}
bool isAry=false;
// Parser
JSONNODE_ITERATOR it = json_begin(n);
char *key=json_name(*it);
if (strcmp(key, "")==) {
//是数组
*obj=CCArray::create();
isAry=true;
}else{
//是字典
*obj=CCDictionary::create();
isAry=false;
}
while (it != json_end(n)) {
if (*it == NULL) {
CCLOG("Invalid JSON Node\n");
return;
}else if(json_type(*it)==JSON_NULL){
CCString *char_str=CCString::ccs("");
if (isAry) {
((CCArray *)*obj)->addObject(char_str);
}else{
string key=json_name(*it);
CC_ASSERT(!key.empty());
((CCDictionary *)*obj)->setObject(char_str, key);
}
}else if (json_type(*it) == JSON_ARRAY || json_type(*it) == JSON_NODE) {
CCObject *tempobj=NULL;
parseArrJSON(*it,&tempobj);
if (isAry) {
((CCArray *)*obj)->addObject(tempobj);
}else{
string key=json_name(*it);
CC_ASSERT(!key.empty());
((CCDictionary *)*obj)->setObject(tempobj, key);
}
}
else if(json_type(*it)==JSON_STRING){
json_char *value = json_as_string(*it);
CCString *char_str=CCString::create(value);
if (isAry) {
((CCArray *)*obj)->addObject(char_str);
}else{
string key=json_name(*it);
CC_ASSERT(!key.empty());
((CCDictionary *)*obj)->setObject(char_str, key);
}
json_free(value);
}else if(json_type(*it)==JSON_NUMBER){
// json_int_t value = json_as_int(*it);
json_number value = json_as_float(*it);
CCString *char_str=CCString::createWithFormat("%.2f",value);
if (isAry) {
((CCArray *)*obj)->addObject(char_str);
}else{
string key=json_name(*it);
CC_ASSERT(!key.empty());
((CCDictionary *)*obj)->setObject(char_str, key);
}
}
++it;
}
}
CCObject * JsonUtil:: jsonValue(const char *_char){
JSONNODE *an = json_parse(_char);
CCObject *obj=NULL;
JsonUtil::parseArrJSON(an,&obj);
json_delete(an);
return obj;
}
创建个类JsonUtil,包含两个静态方法,使用的时候调用JsonUtil::jsonValue(const char *_char),解析的结果会保存在字典或者数组中,例子:
const char *betem="[{\"中国食谱\":[\"上海醉蟹\",\"北京锅烧鸡\",\"川式凉拌豇豆\",\"清真酱牛肉\"],\"国外食谱\":[\"泰式柠檬肉片\",\"鸡柳汉堡\",\"蒸桂鱼卷 \"],\"更多\":{\"中式\":[\"南\",\"北\",{\"地方\":[\"小吃\",\"大餐\"]},\"更多选择\"]}},{\"菜谱分类\":[\"上海菜\",\"贵州菜\",\"潮汕菜\",\"云南菜\",\"东北菜\",\"安徽菜\",\"广东菜\",\"浙江菜\",\"湖南菜\"]},\"其它\"]";
CCArray  *ary= (CCArray *)   JsonUtil::jsonValue(betem);
ccout(ary);
这里的ccout是自定义的用来打印数组和字典的方法。cocos2d-x的CCLog跟NSLog相比起来真是差远了,哪怕把时间打印出来也好啊。
附上ccout代码,可以用来打印保存在CCArray或CCDictionary中的json数据,勉强做成类似NSLog输出的样子:
void ccout(CCObject *thob,int donotset=,bool dot=false);
void AppDelegate::ccout(CCObject *thob,int donotset,bool dot){
    if (dynamic_cast<CCDictionary *>(thob)) {
        cout<<"{";
        CCDictionary *temp=(CCDictionary *)thob;
        CCDictElement *ele;
        CCDICT_FOREACH(temp, ele){
            const char *key=ele->getStrKey();
            CCObject *ob=ele->getObject();
            cout<<endl;
            for (int i=; i<donotset+; i++)cout<<"\t";
            cout<<key<<"=";
            this->ccout(ob,donotset+);
            cout<<";";
        }
        cout<<std::endl;
        for (int i=; i<donotset; i++)cout<<"\t";
        cout<<"}";
        if (dot) {
            cout<<",";
        }
    }else if (dynamic_cast<CCArray *>(thob)){
        cout<<"(";
        CCArray *temp=(CCArray *)thob;
        CCObject *ob;
        CCARRAY_FOREACH(temp, ob){
            if (dynamic_cast<CCDictionary *>(ob)) {
                if (ob!=temp->lastObject()) {
                    this->ccout(ob,donotset+,true);
                }else{
                    this->ccout(ob,donotset+);
                }
            }else
                if (dynamic_cast<CCArray *>(ob)) {
                    this->ccout(ob,donotset+);
                }else if (dynamic_cast<CCString *>(ob)) {
                    cout<<((CCString*)ob)->getCString();
                    if (ob!=temp->lastObject()) {
                        cout<<",";
                    }
                }else{
                    cout<<"undefined class cout";
                }
        }
        cout<<")";
    }
}
输出结果:
({
        中国食谱=(上海醉蟹,北京锅烧鸡,川式凉拌豇豆,清真酱牛肉);
        国外食谱=(泰式柠檬肉片,鸡柳汉堡,蒸桂鱼卷 );
        更多={
                中式=(南,北,{
                            地方=(小吃,大餐);
                        },更多选择);
            };
    },{
        菜谱分类=(上海菜,贵州菜,潮汕菜,云南菜,东北菜,安徽菜,广东菜,浙江菜,湖南菜);
    },其它)
cocos2d-x把json数据解析到数组或字典中(libjson库)的更多相关文章
- JSON数据解析 基础知识及链接收集
		JSON数据解析学习 JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式. JSON 是存储和交换文本信息的语法.类似 XML.但是JSON 比 ... 
- JSON数据解析(转)
		JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android ... 
- iOS - JSON 数据解析
		iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ... 
- Android学习笔记之JSON数据解析
		转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ... 
- Json数据解析在Unity3d中的应用
		最近做项目过程中因为Json文件名写错了一个字母Unity报错,找错误找到半夜,当时为了验错,写了一个小Demo,正好借此总结一下Json. 1.什么是Json JSON(JavaScript Obj ... 
- Jquery Ajax和getJSON获取后台普通Json数据和层级Json数据解析
		<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- jQuery AJAX获取JSON数据解析多种方式示例
		<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- 使用Gson轻松解决复杂结构的Json数据解析
		转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50961803 JSON简介 JSON(JavaScript Object Notati ... 
- 最简单简洁高效的Json数据解析
		一.无图无真相 二.主要代码 1.导入jar包 拷贝fastjson.jar包到projectlibs包下 2.封装工具类JsonUtil.java package com.example.parse ... 
随机推荐
- OPENCV第一篇
			了解过之前老版本OpenCV的童鞋们都应该清楚,对于OpenCV1.0时代的基于 C 语言接口而建的图像存储格式IplImage*,如果在退出前忘记release掉的话,就会照成内存泄露.而且用起来超 ... 
- Java读书笔记二(封装类)
			1.介绍 都知道java中基本数据类型有非常多,比方string,int--,可是基本数据类型与对象之间是不同的.但非常多情况下,我们希望将基本数据类型当作对象使用,这时候就须要用到封装类. 2.封装 ... 
- Android代码混淆
			混淆器(ProGuard) --- 混淆器通过删除从未用过的代码和使用晦涩名字重命名类.字段和方法,对代码进行压缩,优化和混淆.结果是一个比較小的.apk文件,该文件比較难进行逆向project.因此 ... 
- @property的特性
			@property还有一些关键字,它们都是有特殊作用的,比如上述代码中的nonatomic,strong: 1 2 @property(nonatomic,strong) NSString *carN ... 
- 【剑指Offer学习】【面试题43 : n 个锻子的点数】
			题目:把n个骰子扔在地上,全部骰子朝上一面的点数之和为s.输入n.打印出s 的全部可能的值出现的概率. 解题思路 解法一:基于通归求解,时间效率不够高. 先把n个骰子分为两堆:第一堆仅仅有一个.还有一 ... 
- Qt深入:不能不知道的Type、Attribute和Flags
			Qter高手与新手的区别在于:知道还是不知道 Qt不是开发语言,所以无所谓谁厉害.但使用他的Qter却有着差异,也许是面向对象语言本身的.或者实际经验上的.而对于Qt本身来说,高手与新手最显著的差异在 ... 
- Swift: Initialization-2
			Failable Initializers 有的时候,可能是参数问题.需要的外部资源没有到位等原因,初始化可能失败.为了应对这种情况,我们可以定义一个或多个可失败的构造方法. init? A fail ... 
- AutoBackupForApps
			This sample demonstrates how to selectively disable Automatic Backups in Android M, either by adjust ... 
- ubuntu 查看端口被占用并处理
			当启动程序出现端口号被占用的情况,需要查看端口使用情况,使用netstat命令,下面是常用的几个查看端口情况的命令:查看所有的服务端口(ESTABLISHED netstat -a查看所有的服务端口, ... 
- python 之路,Day11 (下)- sqlalchemy ORM
			python 之路,Day11 - sqlalchemy ORM 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM ... 
