C++Builder Tokyo 10.2中TJSONIterator的TRewindReaderProc使用问题
解决C++Builder Tokyo 10.2 Update 3中TJSONIterator的使用问题
我刚好在这个版本的C++Builder里折腾过TJSONIterator,太懂你说的文档匮乏、踩坑费劲的感受了!针对你提到的构造TJSONIterator必须传入TRewindReaderProc否则抛异常,以及用Find方法判断JSON路径是否存在的需求,给你整理了实操方案:
核心原理:TRewindReaderProc的作用
TJSONIterator是基于流的JSON迭代器,它本身没有内置的流回溯能力。官方要求传入的TRewindReaderProc是一个回调函数,用来在需要的时候把流重置到起始位置——比如当你调用Find方法时,迭代器可能需要重新遍历JSON结构,这就依赖这个回调来“倒带”流。
完整代码示例
下面是一个可直接复用的例子,涵盖从JSON字符串加载、构造迭代器、判断路径存在性的全流程:
#include <System.JSON.hpp> #include <System.Classes.hpp> #include <Vcl.Dialogs.hpp> void CheckJSONPaths() { // 示例JSON数据 UnicodeString jsonContent = L"{\"car\": {\"model\": {\"colour\": \"navy\"}, \"year\": 2023}, \"features\": [\"ABS\", \"ESP\"]}"; // 创建承载JSON的字符串流 TStringStream* jsonStream = new TStringStream(jsonContent, TEncoding::UTF8); try { // 定义重绕回调:将流指针重置到起始位置 TRewindReaderProc rewindCallback = [jsonStream]() { jsonStream->Position = 0; }; // 构造TJSONIterator,必须传入重绕回调 TJSONIterator* jsonIter = new TJSONIterator(jsonStream, rewindCallback); try { // 测试对象嵌套路径:car.model['colour'] bool pathExists = jsonIter->Find(L"car.model['colour']"); if (pathExists) { ShowMessage(L"路径 car.model['colour'] 存在,值为:" + jsonIter->Value()->Value()); } else { ShowMessage(L"路径 car.model['colour'] 不存在"); } // 测试数组路径:features[0] pathExists = jsonIter->Find(L"features[0]"); if (pathExists) { ShowMessage(L"路径 features[0] 存在,值为:" + jsonIter->Value()->Value()); } else { ShowMessage(L"路径 features[0] 不存在"); } // 测试不存在的路径:car.price pathExists = jsonIter->Find(L"car.price"); if (!pathExists) { ShowMessage(L"路径 car.price 不存在,符合预期"); } } __finally { // 确保迭代器资源被释放 delete jsonIter; } } __finally { // 确保流资源被释放 delete jsonStream; } }
关键注意事项
- 流类型适配:如果你的JSON是从文件加载的,只需把
TStringStream换成TFileStream,回调里同样设置Stream->Position = 0即可。 - 路径格式支持:
Find方法支持两种对象键写法:.key和['key'],数组则统一用[index]格式,比如list[2]['name']。 - 内存安全:一定要用
__finally块释放TJSONIterator和流对象,避免内存泄漏——C++Builder的JSON组件大多需要手动管理内存。 - 异常处理:如果回调未正确实现(比如流无法重置),可能会抛出
EJSONIteratorException,可以根据需求添加try-catch块捕获处理。
确实这个版本的C++Builder JSON相关文档太简陋了,很多细节都得靠自己试错摸索,希望这个方案能帮你少走弯路!
内容的提问来源于stack exchange,提问作者Sconz2
相关产品推荐
相关产品推荐

