登录
  • 欢迎访问 Sharezer Blog

Cocos2d-x中Json(rapidjson)的扩展

Cocos sharezer 2623次浏览 已收录 0个评论

容我直接上代码

/**
*  保存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;
            }
        }
}


Sharezer , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Cocos2d-x中Json(rapidjson)的扩展
喜欢 (2)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址