读取外部Json文件

请问老师我用如下两个库导入,需要读取外部Json文件,在cpp文件是没有报错的,但是编译就报错: No such file or directory。请问是在这里需要专门的MDL相关的读取函数吗

#include <json/json.h>
#include "jsoncpp.cpp"

  • 在MDL的头文件中有一个BeJsonUtilities.h,你将您的json文件夹复制到MDL的include文件夹下,然后在cpp中引入这个BeJsonUtilities.h应该就能工作了。

    #include <BeJsonCpp\BeJsonUtilities.h>



  • 老师引用这个头文件并删除json/json.h,Json::Reader和Json::Value不能用,编译器还是报错无法打开包括文件: “json/json.h”。

    然后我把json/json.h加上,cpp中没有错,编译器还是报无法打开包括文件: “json/json.h”的错误

  • 1. 解压我这个json.7z到C:\Program Files\Bentley\MicroStationCONNECTSDK\include下

    json.7z

    2. cpp中至少要引入如下两个头文件:

    #include <fstream>
    #include <BeJsonCpp\BeJsonUtilities.h>

    3. cpp中至少要声明如下两个命名空间(注意,第二行的宏定义结尾不需要分号,在宏定义中已经有啦):

    using namespace std;
    USING_NAMESPACE_BENTLEY

    4. 用如下代码测试是成功的:

    void ReadJsonTest()
    {
    	WString jsonFileName{ LR"(D:\Foo-src\MDL.CE\File\Items.json)" };
    	JsonValueR root{};
    	Json::Reader reader;
    	std::ifstream ifs;
    	ifs.open(jsonFileName.GetWCharCP());
    	reader.parse(ifs, root);
    }



  • l老师我按照这个测试代码,有个地方提示非常量引用的初始值必须为左值

  • 确实,这个JsonValueR应该改成如下行就能编译通过了。不过编译通过后连接又出错了,还得需要一个未公开的库文件BeJson.lib。所以,这个路子不太行。

    Json::Value root;

    还是采用第三方开源的JsonCPP库吧。我下载并改造过如下:

    jsoncpp.7z

    将该压缩包解压到你的MDL源代码文件夹下,然后在cpp中写如下包含语句:

    #include    <fstream>
    #include    <Mstn\MdlApi\MdlApi.h>
    #include    <Mstn\ISessionMgr.h>
    #include    <Mstn\MdlApi\msdialog.fdf>
    #include    "jsoncpp/json/json.h"

    下面是我的cpp中读写Json的两个函数:

    /*----------------------------------------------------+
    |    writeJsonFile
    +----------------------------------------------------*/
    void writeJsonFile(WCharCP wFullFileName, Json::Value& value)
    {
    	char fullFileName[256];
    	mdlCnv_convertUnicodeToMultibyte(wFullFileName, -1, fullFileName, 256);
    	std::ofstream ofs;
    	ofs.open(fullFileName);
    	assert(ofs.is_open());
    
    	Json::StreamWriterBuilder builder;
    	std::unique_ptr<Json::StreamWriter> const sWriter(builder.newStreamWriter());
    	sWriter->write(value, &ofs);
    
    	ofs.close();
    }
    /*----------------------------------------------------+
    |    readJsonFile
    +----------------------------------------------------*/
    void readJsonFile(Json::Value& root, WStringCR wFullFileName)
    {
    	char fullFileName[256];
    	mdlCnv_convertUnicodeToMultibyte(wFullFileName.GetWCharCP(), -1, fullFileName, 256);
    
    	std::ifstream ifs;
    	ifs.open(fullFileName);
    	Json::Reader reader;
    	reader.parse(ifs, root, false);
    
    	ifs.close();
    }