C++ Builder,如何从 TJSONArray 获取值?

问题描述 投票:0回答:1

我正在使用 C++ Builder 10.2.3。

我收到了 HTTP 请求的响应。我正在尝试从

TJSONArray
:

检索值
System::Net::Httpclient::_di_IHTTPResponse response = NetHTTPRequest1->Get("https://url"); 

System::Json::TJSONValue* ResponseData = TJSONObject::ParseJSONValue(response->ContentAsString(TEncoding::UTF8));

UnicodeString Value = ResponseData->GetValue<TJSONArray>("Item1").Items[0]->GetValue<UnicodeString>("SubItem1");

但是我收到以下错误:

[ilink64 错误] 错误:无法解析的外部 'System::Json::TJSONArray `System::Json::TJSONValue::GetValue(System::UnicodeString)

如何从

TJSONArray
检索值?

json c++builder
1个回答
0
投票

文档对此错误进行了解释:

如何在 C++ 中处理 Delphi 泛型

Delphi 泛型作为模板暴露给 C++。然而,重要的是要认识到实例化发生在 Delphi 端,而不是在 C++ 中。因此,您只能将这些模板用于在 Delphi 代码中显式实例化的类型。

...

如果 C++ 代码尝试对未在 Delphi 中实例化的类型使用 Delphi 泛型,您将在链接时收到错误。 简而言之,除非 Pascal 代码实例化专门化来解析链接器引用,否则您不能在 C++ 中使用专门的泛型方法。

话虽如此,您的代码有一个拼写错误。您需要使用

GetValue<TJSONArray*>
来代替,因为 Delphi 类是引用类型,而不是值类型:

UnicodeString Value = ResponseData->GetValue<TJSONArray*>("Item1")->Items[0]->GetValue<UnicodeString>("SubItem1");

如果仍然出现链接器错误,那么您将不得不使用非通用方法,例如:

TJSONValue *jv = ResponseData->FindValue("Item1");
if (!jv) ...
jv = static_cast<TJSONArray*>(jValue)->Items[0]->FindValue("SubItem1");
if (!jv) ...
UnicodeString Value = jv->Value();
© www.soinside.com 2019 - 2024. All rights reserved.