请问老师我用如下两个库导入,需要读取外部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(); }