Cocos 3.3对于rapidjson读取做了什么改动么?

之前有个程序在PC、MAC上能正常跑,打包成apk就会闪退。后来不断尝试,发现当把读取json的代码注释掉就可以正常运行,一放开就挂,然后那份代码其实之前在3.2版本编译过是没有问题的,当然代码还是有点改动的,为了防止是其他地方引起,就又把版本退回3.2试了下,没有问题。所以,3.3版本json读取有什么改动呢?

没有看到有什么对它的改动啊,这是版本变更说明,你可以看下https://github.com/fusijie/Cocos2dx-ReleaseNote-zh
至于楼主遇到的这问题,我还是第一次看到:13:

是哪部分代码使用json?是你自己的还是引擎内部哪个模块解析用了json?

如果是你自己使用了external/json这个第三方库,那需要确认一下json库是否有升级,我们不会自己修改这些第三方库。

如果是引擎的哪个模块使用了json解析,请描述清楚。

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    Common::getInstance()->readDataByJson("config.json");
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLViewImpl::create("FlySimulation");
        
        director->setOpenGLView(glview);
    }

    glview->setDesignResolutionSize(g_vPageInfo.m_ffarmWidth, g_vPageInfo.m_ffarmHeight, ResolutionPolicy::EXACT_FIT);
    //glview->setFrameSize(g_vPageInfo.m_ffarmWidth, g_vPageInfo.m_ffarmHeight);
    // turn on display FPS
    director->setDisplayStats(false);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);

    // create a scene. it's an autorelease object
    auto scene = MFDLayer::createScene();
    //auto scene = HelloWorld::createScene();

    // run
    director->runWithScene(scene);

    return true;
}


void  Common::readDataByJson(const char* fileName)
{
    g_vPageInfo.clear();
    if (FileUtils::getInstance()->isFileExist(fileName))
    {
        rapidjson::Document doc;
        //unsigned long size; 
        string data = FileUtils::getInstance()->getStringFromFile(fileName);
                //去注释
        char* jsonData = (char*)malloc(sizeof(char) * (data.size()+1));
        memset(jsonData, 0, data.size()+1);
        getRealString(jsonData, data.c_str(), (int)data.size());

        doc.Parse(jsonData);
        free(jsonData);

        if (!doc.HasParseError() && doc.IsArray()){
            for (unsigned int i = 0; i < doc.Size(); i++)
            {
                //每一页的配置
                rapidjson::Value &v = doc*;
                PageData curPage;
                //memset(&curPage, 0, sizeof(PageData));
                curPage.m_mParamValue.clear();
                if (v.HasMember("farmWidth")){
                    curPage.m_ffarmWidth = v"farmWidth"].GetDouble();
                }else{
                    curPage.m_ffarmWidth  =960.0f;
                }

                if (v.HasMember("farmHeight")){
                    curPage.m_ffarmHeight = v"farmHeight"].GetDouble();
                }else{
                    curPage.m_ffarmHeight = 640.0f;
                }
                
                if (v.HasMember("background")){
                    curPage.m_background = v"background"].GetString();
                }else{
                    curPage.m_background = "";
                }
                

                //当前页的控件列表
                if (v.HasMember("WidgetList")){
                    rapidjson::Value &vw=v"WidgetList"];
                    if (vw.IsArray())
                    {
                        for (unsigned int j = 0; j < vw.Size(); j++)
                        {
                            rapidjson::Value &aw=vw;
                            WidgetData* pcurWidget = new WidgetData;
                            memset(pcurWidget, 0, sizeof(WidgetData));
                            pcurWidget->m_vbaseData.clear();
                            if (aw.HasMember("name"))
                            {
                                pcurWidget->m_sWidgetName = aw"name"].GetString();
                            }
                            else
                            {
                                CCLOG("error: no name!");
                            }
                            if (aw.HasMember("positionX"))
                            {
                                pcurWidget->m_fPositionX = (float)aw"positionX"].GetDouble();
                            }
                            else
                            {
                                pcurWidget->m_fPositionX = 0;
                            }
                            if (aw.HasMember("positionY"))
                            {
                                pcurWidget->m_fPositionY = (float)aw"positionY"].GetDouble();
                            }
                            else
                            {
                                pcurWidget->m_fPositionY = 0;
                            }
                            if (aw.HasMember("zorder"))
                            {
                                pcurWidget->m_iWidgetZorder = aw"zorder"].GetInt();
                            }
                            else
                            {
                                pcurWidget->m_iWidgetZorder = 0;
                            }
                            //当前控件的参数
                            if (aw.HasMember("param"))
                            {
                                rapidjson::Value &vp=aw"param"];
                                if (vp.IsArray())
                                {
                                    for (unsigned int k = 0; k < vp.Size(); k++)
                                    {
                                        rapidjson::Value &ap=vp;
                                        BaseData curBaseData;
                                        memset(&curBaseData, 0, sizeof(BaseData));
                                        if (ap.IsNumber())
                                        {
                                            curBaseData.m_dataType = 0;
                                            curBaseData.m_fData = (float)ap.GetDouble();
                                        }
                                        else if (ap.IsString())
                                        {
                                            curBaseData.m_dataType = 1;
                                            curBaseData.m_sData = ap.GetString();
                                        }
                                        else
                                        {
                                            CCLOG("warning: no this data type: %d", ap.GetType());
                                        }
                                        pcurWidget->m_vbaseData.push_back(curBaseData);
                                    }

                                }

                            }
                            else
                            {
                                CCLOG("warning: WidgetList!");
                            }
                            char widgetCount = {0};
                            sprintf(widgetCount,"Page%dWidget%d", i, j);
                            curPage.m_mParamValue.insert(pair(widgetCount,pcurWidget));
                        }
                    }
                }
                else
                {
                    CCLOG("error: no param!");
                }
                g_vPageInfo.push_back(curPage);
            }
        }
    }
}



```


就是在AppDelegate里先读取json配置*

我看了下json库,3.2和3.3应该是一样的,没升级过。你确认下挂在什么地方。这应该和rapidjson相关性大一点。

看不出来,不过我刚写的解析json文件, 比较懒写的简单,省了许多没写, 代码如下

rapidjson::Document doc;
std::string JsonData = FileUtils::getInstance()->getStringFromFile(“conf/PayGuide.json”);
doc.Parserapidjson::kParseDefaultFlags(JsonData.c_str());

rapidjson::Value &v = doc;
id = DICTOOL->getIntValue_json(v, "pay_id", 0);

std::string titleFileName = DICTOOL->getStringValue_json(v, "pay_title", "");
this->initTitle(titleFileName);

std::string iconFileName = DICTOOL->getStringValue_json(v, "pay_icon", "");
this->initIcon(iconFileName);

std::string notice_1 = DICTOOL->getStringValue_json(v, "pay_notice_1", "");
std::string notice_2 = DICTOOL->getStringValue_json(v, "pay_notice_2", "");
std::string notice_3 = DICTOOL->getStringValue_json(v, "pay_notice_3", "");
this->initNameAndNotice(notice_1, Gold, notice_2, SongGold, SongType, notice_3, noticeGold);

std::string notice = DICTOOL->getStringValue_json(v, "pay_notice", "");
this->initPayNotice(notice, value1, value2, value3, value4, value5);