我在 C++ 中有一个 dll,用于表现得像智能卡。我写了一个 JSON 文件来接收数据和响应想要的响应。它看起来像这样: { "00xxxxxx" : ["aaaaaaaaaaaaaaaaa", { "00yyyyyyyyyy" : ["bbbbbbbbbbbbbbbb", { "00zzzzzzzzz" : ["9000", {}] }] }] } 我的 CommandHandler.cpp 文件从另一个应用程序接收命令。它看起来像下面这样: string CommandHandler::sendCommand(string command) { data=data[command]; string response; if(data == nullptr){ response="6700"; return response; } response=data[0]; data=data[1]; return response; } CommandHandler::CommandHandler(){} //Empty constructor CommandHandler::CommandHandler(string jsonCommandsPath) { std::ifstream f(jsonCommandsPath); data=json::parse(f); } string CommandHandler::getJsonFile(){ jsonCommandsPath="MyPath"; return jsonCommandsPath; } 最后,我在另一个名为 FakeTransmitter.cpp 的类中调用 CommandHandler 构造函数: CommandHandler command; NOT_EXPORTED CommandHandler commandHandler(command.getJsonFile()); EXPORTED LONG CardTransmit(CARDHANDLE hCard, LPCBYTE pbSendBuffer, DWORD cbSendLength, /*@out@*/ LPBYTE pbRecvBuffer, PDWORD pcbRecvLength) { string command=Conversion::ByteArrayToHexStr(pbSendBuffer, cbSendLength); string response=commandHandler.sendCommand(command); //here I wrote response code, it works correctly. return 5; } 我用 CMake 构建这个项目,并在另一个项目中使用 dll 进行假响应。但是,在第一次调用它起作用的命令时,在我调用相同的命令后,它返回“6700”,这意味着它返回 nullptr。 第二个项目的输出如下所示: Command: 00xxxxxx Response: aaaaaaaaaaaaaaaaa Command: 00yyyyyyyyyy Response: bbbbbbbbbbbbbbbb Command: 00zzzzzzzzz Response: 9000 Command: 00xxxxxx -------> Here I call first command again in the same runtime Response: 6700 我想,我不能再读取那个 JSON 文件了。从第二个项目调用时如何到达相同的命令? 我只想在再次调用相同命令时显示响应。我期望的输出应该是这样的: Command: 00xxxxxx Response: aaaaaaaaaaaaaaaaa Command: 00yyyyyyyyyy Response: bbbbbbbbbbbbbbbb Command: 00zzzzzzzzz Response: 9000 Command: 00xxxxxx Response: aaaaaaaaaaaaaaaaa Command: 00yyyyyyyyyy Response: bbbbbbbbbbbbbbbb Command: 00zzzzzzzzz Response: 9000 我已经在项目中尝试过 f.close() 和 f.open() 。也许我用错了它们,但是当我使用它们时,它会返回“无效的内存访问”。有解决这个问题的方法吗?

所以在我看来,当您收到无法用当前 JSON 结构理解的命令时,您希望重新使用原始 JSON 结构。所以要做到这一点,你需要先在你的类中保存原始的 JSON 结构 CommandHandler::CommandHandler(string jsonCommandsPath) { std::ifstream f(jsonCommandsPath); originalData = json::parse(f); // save the original data data = originalData; // and start with the original data } 您将需要添加originalData到您的CommandHandler班级。因为您没有展示该课程,所以我无法告诉您该怎么做,但希望它足够清楚。 然后,当您发现无法理解的命令时,您需要重新使用该原始数据。 string CommandHandler::sendCommand(string command) { data = data[command]; string response; if(data == nullptr){ data = originalData; // restore the original data return sendCommand(command); // and try again } response = data[0]; data = data[1]; return response; } 我有点猜测,因为您的要求并不完全清楚。

data = data[command];为什么这样?看起来像一个错字,因为每次你打电话时sendCommand,你的data领域都会被覆盖到它的一个分支。

在我看来,您似乎已经编写了一堆代码,但现在这些代码并没有按照您的想法执行,您也不确定为什么?好消息是您可以使用调试器并单步执行代码以查看其作用并希望找出原因。

@pptaszni 查看正在处理的 JSON 数据的递归性质。我认为这条线是故意的。

请展示一个最小的可重现示例

你真的明白我需要什么。感谢您的帮助 :)