以前在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库)的更多相关文章

  1. JSON数据解析 基础知识及链接收集

    JSON数据解析学习 JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式. JSON 是存储和交换文本信息的语法.类似 XML.但是JSON 比 ...

  2. JSON数据解析(转)

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android ...

  3. iOS - JSON 数据解析

     iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...

  4. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  5. Json数据解析在Unity3d中的应用

    最近做项目过程中因为Json文件名写错了一个字母Unity报错,找错误找到半夜,当时为了验错,写了一个小Demo,正好借此总结一下Json. 1.什么是Json JSON(JavaScript Obj ...

  6. Jquery Ajax和getJSON获取后台普通Json数据和层级Json数据解析

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. jQuery AJAX获取JSON数据解析多种方式示例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 使用Gson轻松解决复杂结构的Json数据解析

    转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50961803 JSON简介 JSON(JavaScript Object Notati ...

  9. 最简单简洁高效的Json数据解析

    一.无图无真相 二.主要代码 1.导入jar包 拷贝fastjson.jar包到projectlibs包下 2.封装工具类JsonUtil.java package com.example.parse ...

随机推荐

  1. lightoj 1004 dp:数字三角形

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1004 #include <cstdio> #include <cst ...

  2. UVa 674: Coin Change

    动态规划题.对于1,5,10,25,50五种币值的硬币,编号为0~4,存入数组cent中.数组iWay的元素iWay[k][i]表示仅使用0~i的硬币凑出k分钱的方法数,按是否使用编号为i的硬币分类, ...

  3. Bash 字符串处理命令

    字符串长度 str="abc" echo ${#str} 查找子串的位置 str="abc" str1=`expr index $str "a&quo ...

  4. Confluence5.1 最新版的安装&破解&汉化

    转自 博客 http://seanzhou.iteye.com/blog/1287016 亲自基本上按照这个教程装了一遍,成功运行. 1.介绍 Atlassian Confluence(简称Confl ...

  5. iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath(汇总)

    iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath 首先分析有几种原因,以及相应的解决方法 1.UITableViewCell的userInterac ...

  6. 数据库框架 Litepal

    1.导包 dependencies {   compile 'org.litepal.android:core:1.4.1' } 2.在asstes中建立litepal.xml文件 <?xml ...

  7. boost库在工作(15)绑定器与函数对象之三

    前面已经可以优美地解决两个参数的函数给算法for_each调用了,但是又会遇到这样的一种情况,当需要三个参数或者三个以上的参数给算法for_each调用呢?从STL里的绑定器bind1st,显然是不行 ...

  8. 在浏览器地址栏按回车、F5、Ctrl+F5刷新网页的区别--转

    其中,在地址栏按回车又分为两种情况.一是请求的URI在浏览器缓存中未过期,此时,使用Firefox的firebug插件在浏览器里显示的HTTP请求消息头如下: Host    192.168.3.17 ...

  9. TCP/IP协议原理与应用笔记08:对等层和对等实体

    1. 我们直接通过下面这个图,就可以直观了解: Outlook :收发邮件的软件组件. IE:浏览器. CutFTP:文件传输工具. 小结:因为为了完成不同的功能,所以会出现不同实体,这些不同的实体为 ...

  10. Redis的AOF功能

    引言:  Redis是基于内存的数据库,同时也提供了若干持久化的方案,允许用户把内存中的数据,写入本地文件系统,以备下次重启或者当机之后继续使用.本文将描述如何基于Redis来设置AOF功能 什么是R ...