容我直接上代码
/**
* 保存Json文件
*
* @param fileName 文件名
* @param doc Json对象
*
* @return 是否保存成功
*/
static bool saveJsonFile(const char *fileName, rapidjson::Document &doc)
{
bool bRet = false;
do
{
//LS_LOG("file path : %s", fileName);
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
doc.Accept(writer);
std::string str = buffer.GetString();
FILE *fp = std::fopen(lsStandardPath(fileName).c_str(), "wb");
CCASSERT(fp != nullptr, "file open error");
//fwrite(str.c_str(), str.length(), 1, fp);
fputs(str.c_str(), fp);
fclose(fp);
bRet = true;
}
while (0);
return bRet;
}
/**
* 删除Json数组的某一个对象
*
* @param index 第几个
* @param value Json对象
*
* @return 是否读取成功
*/
static bool removeJsonArrayItem(int index, rapidjson::Value &value)
{
bool bRet = false;
int size = value.Size();
if (index < size)
{
for (unsigned int i = index; i + 1 < value.Size(); i++)
value[i] = value[i + 1];
value.PopBack();
bRet = true;
}
return bRet;
}
/**
* 将char*转成Json对象
*
* @param str 要转换的字符
* @param doc 转换后的Json对象
*
* @return 是否转换成功
*/
static bool readJsonWithString(const char *str, rapidjson::Document &doc)
{
bool bRet = false;
do
{
std::string content(str);
replaceString(content, ":null", ":""");
doc.Parse<0>(content.c_str());
CCASSERT(!doc.HasParseError(), "HasParseError");
bRet = true;
}
while (0);
return bRet;
}
/**
* 读取Json文件
*
* @param fileName 文件名
* @param doc 转换后的Json对象
*
* @return 是否读取成功
*/
static bool readJsonWithFile(const char *fileName, rapidjson::Document &doc)
{
bool bRet = false;
if (cocos2d::FileUtils::getInstance()->isFileExist(fileName))
{
std::string contentStr = cocos2d::FileUtils::getInstance()->getStringFromFile(fileName);
//LS_LOG("%s connent:%s", fileName, contentStr.c_str());
bRet = readJsonWithString(contentStr.c_str(), doc);
}
return bRet;
}
/**
* 将json的Value转成String
*
* @param node Json格式的Value
* @param strret 转换后的String
*
* @return 0表示成功,-1表示失败
*/
static int valueToString(const rapidjson::Value &node, std::string &strret)
{
strret.clear();
char tmp[64] = { 0 };
if (node.IsString())
{
strret = node.GetString();
return 0;
}
else if (node.IsDouble())
{
//sprintf_s(tmp,63, "%.2lf", node.GetDouble());
sprintf(tmp, "%.2lf", node.GetDouble());
strret = tmp;
return 0;
}
else if (node.IsNumber())
{
sprintf(tmp, "%.0lf", node.GetDouble());
strret = tmp;
return 0;
}
else if (node.IsFalse())
{
strret = "false";
return 0;
}
else if (node.IsTrue())
{
strret = "true";
return 0;
}
return -1;
}
/**
* 查找Json数据中的值
*
* @param node Json格式的Value
* @param key 关键字
* @param value 值
*
* @return -1表示失败,其他情况表示数组中第几个
*/
static int getIndexWithJsonArray(rapidjson::Value &node, const char *key, const char *value)
{
int index = -1;
if (node.IsArray())
{
for (unsigned int i = 0; i < node.Size(); i++)
{
//const char* temp = node[i][key].GetString();
//LS_LOG("%s%s", value, temp);
if (strcmp(value, node[i][key].GetString()) == 0)
{
index = i;
break;
}
}
}
CCASSERT(index != -1, "not find value in array");
return index;
}
static void sortJsonArray(rapidjson::Value &node, const char *key, bool isAsc = true)
{
CCASSERT(node.IsArray(), "is not array");
rapidjson::Value temp;
int dir = isAsc ? 1 : -1;
for (unsigned int j = 0; j < node.Size(); j++)
for (unsigned int i = 0; i < node.Size() - 1; i++)
{
CCASSERT(node[i].HasMember(key), "not member");
CCASSERT(node[i][key].IsInt(), "not int");
if (dir * node[i][key].GetInt() > dir * node[i + 1][key].GetInt())
{
temp = node[i];
node[i] = node[i + 1];
node[i + 1] = temp;
}
}
}
