You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:43:54