gpt4 book ai didi

c++ - 使用 TRewindReaderProc 倒回 TJSONIterator 类的输入数据

转载 作者:太空宇宙 更新时间:2023-11-04 12:49:36 27 4
gpt4 key购买 nike

我正在尝试在使用 embarcadero 的 c++builder(Tokyo 10.2 Update 3)构建的程序中解析 JSON,考虑到他们严重缺乏文档,这并不容易。

我正在使用 TJSONIterator Find 方法,如果路径(例如 [0]['key']car.model['colour']) 你给的存在于 JSON 数据中,根据 embarcadero 的文档,它需要一个倒带过程传递给 TJSONIterator 类的构造函数,如果它不存在然后抛出异常说明。

倒带过程应该继承_di_TRewindReaderProc接口(interface),所以这是我的类。

class rewindclass : public TJSONIterator::_di_TRewindReaderProc
{
public:
void __fastcall Invoke(System::Json::Readers::TJsonReader* AReader)
{
//code to rewind Iterator
Areader->Rewind();
}
};

我不确定 Invoke 函数中应该包含哪些内容,因为正如我所说,文档毫无用处。显然你必须对传递的 TJsonReader 做一些事情,我能看到的唯一可以使用的功能是 Rewind 但我不认为就是这样,因为唯一的事情文档说 TRewindReaderProc

Reference to a procedure that rewinds the input data of the specified JSON reader.

Note: TJsonReader.Rewind does not rewind the input data, it resets the state of the JSON
reader. This procedure must rewind the actual data stream that provides the input data
of the JSON reader.

而且我看不出还有什么可以代替。它说必须重置提供输入的实际数据流,但我不确定如何执行此操作。

我正在使用 TStringReader 读取输入到 TJsonTextReader 类构造函数和输入到 TJSONIterator 的 JSON 数据具有使用 _di_TRewindReaderProc 接口(interface)的类的类构造函数。

//create rewindclass
rewindclass *rewind = new rewindclass();

//setting up TJSONIterator class
TStringReader *sread = new TStringReader(this->Memo1->Text);
TJsonTextReader *jread = new TJsonTextReader(sread);
TJSONIterator *jit = new TJSONIterator(jread, *rewind);

此代码编译正常,但当我调试它并进入 TJSONIterator 构造函数时,TJsonTextReader 未通过,因此当我调用 Find 方法第二次抛出异常,提示未设置回调过程。

那么有谁知道为什么 _di_TRewindReaderProc 没有被传递,什么应该进入 Invoke 方法?

最佳答案

我在 Delphi 中为同样的问题苦苦挣扎了几个小时,最后我设法找到了解决问题的方法。我使用 TFileStream 和 TStreamReader 作为底层阅读器而不是 TStringReader,但我希望您了解任何阅读器背后的概念。这是我的代码:

procedure LoadFromFile(AFileName: string);
var
FS: TFileStream;
StreamReader: TStreamReader;
JTReader: TJsonTextReader;
JIterator: TJSONIterator;

RewindProc: TJSONIterator.TRewindReaderProc;

begin
RewindProc := procedure (AReader: TJsonReader)
begin
TStreamReader(TJsonTextReader(AReader).Reader).DiscardBufferedData;
TStreamReader(TJsonTextReader(AReader).Reader).BaseStream.Seek(0, TSeekOrigin.soBeginning);
end;

FS:=TFileStream.Create(AFileName, fmOpenRead);
StreamReader:=TStreamReader.Create(FS);
JTReader:=TJsonTextReader.Create(StreamReader);
JIterator:=TJSONIterator.Create(JTReader , RewindProc);

JIterator.Find('some.path.here');
JIterator.Find('other.path.here');

end;

RewindProc 过程中的代码行创造了奇迹。正如文档所说,您必须让底层读者倒带,这就是我对这两行所做的。第一个清理 StreamReader 的内部缓冲区,第二个将文件指针移动到开头。

我希望这能以某种方式帮助您,因为文档真的很差,而且我在 Internet 上找不到任何关于如何正确设置要传递给 JSON 迭代器的倒带过程的文章。

PD:然后我发现使用 TIterator.Find 时还有一些其他问题,但那是另一回事,所以我专注于您的具体问题。

关于c++ - 使用 TRewindReaderProc 倒回 TJSONIterator 类的输入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49651650/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com