上一个博客讲了怎么用rapidjson读取中文字符串,但是有一个很明显的缺陷 就是不能直接读取数据编辑器导出的数据。下面我们来修复这个bug并且将代码精简到不到原来的一半大小。

上一博客的地址是:【cocos2dx】rapidjson使用方法以及中文显示的解决方法

不多说 直接上源码吧:

首先,数据编辑器导出的格式是:

[{"id":1,"content":"再次按下返回键退出游戏"},{"id":2,"content":"五子棋"},{"id":3,"content":"黑色方"},{"id":4,"content":"白色方"},{"id":5,"content":"当前玩家"},{"id":6,"content":"小提示:"},{"id":7,"content":"null"},{"id":8,"content":"null"},{"id":9,"content":"null"},{"id":10,"content":"null"},{"id":11,"content":"null"},{"id":12,"content":"null"},{"id":13,"content":"null"},{"id":14,"content":"null"},{"id":15,"content":"null"},{"id":16,"content":"null"},{"id":17,"content":"null"}]

导出的时候请选择以属性的方式导出

解析的类:

#pragma once
/*
* 获取字符串类 单例
* 用于获取JSON文件中的中文字符串
*/
#include "cocos2d.h"
#include <string>
#include <cocos-ext.h>
#include "cocostudio\CocoStudio.h"
#include "ui\CocosGUI.h" USING_NS_CC;
USING_NS_CC_EXT;
using namespace std;
using namespace cocostudio;/**
* 数据ID的宏定义,用于找到中文数据
*/
static int s_iExit = 1;  //再次按下返回键退出游戏 class ReadString
{
protected:rapidjson::Document m_doc;    //暂存的数据static ReadString* rs;
public:static ReadString* getInstance();std::string parse(int key);
private:static ReadString* creat(std::string fileName);bool init(std::string fileName);ReadString(){};~ReadString(void){};
};

然后是cpp:

#include "ReadString.h"ReadString* ReadString::rs = nullptr; //初始化
ReadString* ReadString::creat(std::string fileName)
{ReadString *RS = new ReadString(); if(!RS || !RS->init(fileName)){delete RS;RS = nullptr;return nullptr;}return RS;
}bool ReadString::init(std::string fileName)
{bool ret = false;do {std::string jsonpath = FileUtils::getInstance()->fullPathForFilename(fileName);std::string contentStr = FileUtils::getInstance()->getStringFromFile(jsonpath);m_doc.Parse<0>(contentStr.c_str());CC_BREAK_IF(m_doc.HasParseError());ret = true;} while (0);return ret;
}ReadString* ReadString::getInstance()
{if(rs == nullptr)rs= ReadString::creat("String.json");return rs;
}string ReadString::parse(int key)
{if (!m_doc.IsNull() && m_doc.IsArray())  //判断是不是数组{  for(unsigned int i=0;i<m_doc.Size();++i){do {CC_BREAK_IF(m_doc[i].IsNull());CC_BREAK_IF(m_doc[i]["id"].IsNull());int i_id = m_doc[i]["id"].GetInt();CC_BREAK_IF(i_id != key);  //这一行是寻找相同的key,找到了才执行下面的语句,找不到就开始下一个循环CC_BREAK_IF(m_doc[i]["content"].IsNull());return m_doc[i]["content"].GetString();}while(0);}}  return ""; //没查找到任何对象则返回空字符串
}

上一个博客中的read函数被我改成了parse,其实功能是一样的。但是是不是觉得这样好看很多哈。(好吧,其实还是那么难看)

使用的方法也是一样的:

ReadString::getInstance()->parse(s_iExit)

【cocos2dx】rapidjson使用方法以及中文显示的解决方法【续】相关推荐

  1. .sql导入中文显示乱码解决方法

    .sql导入中文显示乱码解决方法 参考文章: (1).sql导入中文显示乱码解决方法 (2)https://www.cnblogs.com/fnote/p/8051682.html 备忘一下.

  2. 取出Cookie中的中文显示乱码解决方法。经验证第三种方法有效。

    取出Cookie中的中文显示乱码解决方法 HttpUtility.UrlEncode(Response.Cookies[ "newcookie "].Values);  HttpU ...

  3. getparameter方法中文显示问号解决方法_电脑显示器花屏怎么办 电脑显示器花屏解决方法【原因分析】...

    本文告诉大家电脑显示器花屏怎么办呢,电脑显示器花屏解决方法和原因分析: 指电脑屏幕上有与常色不同的条纹,斑点或色块,或有位置颠倒.错乱,屏幕抖动.扭曲等情况. 显示器花屏是极其常见的故障,产生的原因有 ...

  4. eclipse中文显示乱码解决方法总结

    Eclipse中文显示为乱码的解决方法     将别人的项目或JAVA文件导入到自己的Eclipse中时,常常会出现JAVA文件的中文注释变成乱码的情况,主要原因就是别人的IDE编码格式和自己的Ecl ...

  5. Linux麒麟系统中文乱码,ubuntu麒麟系统tomcat中文乱码怎么办?ubuntu tomcat中文显示乱码解决方法...

    在ubuntu麒麟系统中安装tomcat后,用户在搭建Demo程序的过程中有遇到tomcat中文显示乱码的情况,一般乱码都是因为编码问题导致的,而如果大家的编码设置是正确的话就是下面的原因导致的,遇到 ...

  6. php mysql 中文_PHP连接MySQL查询结果中文显示乱码解决方法

    我们首先假设数据库中采用的编码为UTF-8 这时我们在PHP页面中应当首先添加 此处charset的值utf-8必须与文件保存时的编码类型一样 之后在数据库查询前添加 mysql_query(&quo ...

  7. Linux vim 中文显示乱码解决方法

    因为在windows下默认是gb编码,而我的vim默认是utf-8(gedit默认也是utf-8),所以打开会成乱码.改动了一下配置文件,使vi支持gb编码就好了. $vi ~/.vimrc let ...

  8. win7系统中文显示乱码解决方法

    本文主要介绍修改注册表和修改语言两种方法解决win7下中文乱码的问题,希望对您有所帮助 一.修改区域时钟语言 1.打开控制面板   2.选择时钟.语言和区域 3.选择区域和语言 4.选择管理 5.选择 ...

  9. EL表达式中文显示乱码解决方法

    请看第4行,加入如下代码即可解决: <% request.setCharacterEncoding("utf-8"); %> <%@ page language= ...

最新文章

  1. python字典get计数_python字典中的get方法与setdefault方法
  2. 开发人员学Linux(8):CentOS7编译安装Subversion及Apache并集成
  3. 检索数据_20_按照字符串数字组合的排序
  4. 元神一直显示连接服务器失败,原神连接服务器失败是什么情况-提示连接服务器失败处理办法-去秀手游网...
  5. 两种方法动态获得ABAP类的class attribute的值
  6. Codeforces Round #640 (Div. 4)(ABCDE)
  7. 牛客网【每日一题】3月27日 数学考试
  8. JAVA 获取操作系统属性
  9. Winform 事件
  10. EKF_SLAM一般过程
  11. 数学建模写作指导20篇(一)-如何写好数学建模论文?
  12. iphone android 功能清单,iPhone的这几个App,让你的工作效率翻倍(1)
  13. RFID射频识别的解读及应用
  14. WIndows编译MAME0.184
  15. 火狐插件restclient发送post请求
  16. 关于C语言的system函数用法
  17. FLD5302和FLD5303升压充电芯片
  18. 一文读懂,CPU、精简指令集、复杂指令集该如何理解?
  19. 重t2加权是什么意思_LOL:每周半价恢复,幸好有一款T2等级皮肤撑场面
  20. AI落地制造业:智能机器人应具备这4种能力

热门文章

  1. Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins:mav问题
  2. 多读书,更要多多悦读
  3. Python_基础知识02
  4. 费曼 计算机科学 讲义,《费曼物理讲义》3 物理学与其他科学的关系
  5. 计算机cpu占用率高,计算机的CPU占用率过高时怎么办
  6. git ssh 登陆失败: no matching host key type found. Their offer: ssh-dss 解决办法
  7. 三调地类图斑统计分析——GP后端实现
  8. 如何从一个文件夹中批量读取图片名字有规则
  9. 通常所说微型计算机的奔3,求江西省2011年计算机等级一级考试试题
  10. 从开发转到安全渗透工程师,是我做的最对的决定