下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

Cocos2D-X基础教程:解析json数据到数组或字典中

作者:课课家教育     来源: http://www.kokojia.com点击数:830发布时间: 2019-04-15 10:28:17

标签: Cocos2D-X字典Cocos2D-X教程Cocos2D-X json

  Cocos2d-x 3.0的发布,使得我们的数据可以解析后保存在数据或字典中,具体是怎么操作的呢?本篇教程将教你怎么把数据根据数据格式保存到数组或字典中。

  以前在cocos2d-x项目中用到json解析,集成了libjson库后发现网上提供的解析方法大多是在解析过程中取得值,并没有将解析结果有效的保存起来,于是摸索一番,把解析结果根据数据格式存到数组或字典当中。

Cocos2D-X基础教程:解析json数据到数组或字典中_Cocos2D-X字典_Cocos2D-X教程_Cocos2D-X json_课课家

  不敢独享,代码奉上:

  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, "")==0) {

  //是数组

  *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=0,bool dot=false);

  void AppDelegate::ccout(CCObject *thob,int donotset,bool dot){

  if (dynamic_cast(thob)) {

  cout<<"{";

  CCDictionary *temp=(CCDictionary *)thob;

  CCDictElement *ele;

  CCDICT_FOREACH(temp, ele){

  const char *key=ele->getStrKey();

  CCObject *ob=ele->getObject();

  cout<<endl;< p="">

  for (int i=0; i<donotset+1; p="" i++)cout<<?\\t?;<="">

  cout<<key<<"=";< p="">

  }

  cout<<std::endl;< p="">

  for (int i=0; i<donotset; p="" i++)cout<<?\\t?;<="">

  cout<<"}";

  if (dot) {

  cout<<",";

  }

  }else if (dynamic_cast(thob)){

  cout<<"(";

  CCArray *temp=(CCArray *)thob;

  CCObject *ob;

  CCARRAY_FOREACH(temp, ob){

  if (dynamic_cast(ob)) {

  if (ob!=temp->lastObject()) {

  this->ccout(ob,donotset+1,true);

  }else{

  this->ccout(ob,donotset+1);

  }

  }else

  if (dynamic_cast(ob)) {

  this->ccout(ob,donotset+1);

  }else if (dynamic_cast(ob)) {

  cout<<((CCString*)ob)->getCString();

  if (ob!=temp->lastObject()) {

  cout<<",";

  }

  }else{

  cout<<"undefined class cout";

  }

  }

  cout<<")";

  }

  }

  输出结果:

  ({

  中国食谱=(上海醉蟹,北京锅烧鸡,川式凉拌豇豆,清真酱牛肉);

  国外食谱=(泰式柠檬肉片,鸡柳汉堡,蒸桂鱼卷 );

  更多={

  中式=(南,北,{

  地方=(小吃,大餐);

  },更多选择);

  };

  },{

  菜谱分类=(上海菜,贵州菜,潮汕菜,云南菜,东北菜,安徽菜,广东菜,浙江菜,湖南菜);

  },其它)

赞(14)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程