在 C++Builder 中解析嵌套 JSON 文件
Parse Nested JSON File in C++Builder
我正在使用带有 64 位编译器的 C++Builder 10.4.2。我正在尝试解析下面的嵌套 JSON 文件,以便 "US.NYSE"
值位于 TJSONArray
中,然后遍历它们以获取每个数组值。我的代码没有将 "US.NYSE"
放入数组中。你能展示如何将 "US.NYSE"
放入 TJSONArray
中吗?目前,我无法测试 for
循环,这个 for
循环设置是否正确?
{
"data":{
"US.NYSE":{
"fin_id":"US.NYSE",
"exchange":"New York Stock Exchange",
"market":"Canonical",
"products":null,
"local_time":"2020-11-27T11:55:00-05:00",
"status":"Open",
"reason":"Market Holiday - Primary Trading Session (Partial)",
"until":"2020-11-27T12:45:00-05:00",
"next_bell":"2020-11-27T13:00:00-05:00"
}
}
}
void __fastcall TForm1::Button33Click(TObject *Sender)
{
UnicodeString s1, s2, s3, s4, s5, s6, s7, s8, s9;
std::unique_ptr<TStringStream> jsonstream(new TStringStream);
jsonstream->LoadFromFile("marketstatus1.json");
TJSONObject* MyjsonFile = (TJSONObject*)TJSONObject::ParseJSONValue(jsonstream->DataString);
Application->MessageBoxW(MyjsonFile->ToString().w_str(), L"", 0);
TJSONArray* MyjsonArray = (TJSONArray*)TJSONObject::ParseJSONValue(MyjsonFile->GetValue("data")->ToString());
Application->MessageBoxW(MyjsonArray->ToString().w_str(), L"", 0);
int TestCount = MyjsonArray->Count;
for(int i=0; i<MyjsonArray->Count; i++){
s1 = MyjsonArray->Items[i]->GetValue<UnicodeString>("fin_id");
s2 = MyjsonArray->Items[i]->GetValue<UnicodeString>("exchange");
s3 = MyjsonArray->Items[i]->GetValue<UnicodeString>("market");
s4 = MyjsonArray->Items[i]->GetValue<UnicodeString>("products");
s5 = MyjsonArray->Items[i]->GetValue<UnicodeString>("local_time");
s6 = MyjsonArray->Items[i]->GetValue<UnicodeString>("status");
s7 = MyjsonArray->Items[i]->GetValue<UnicodeString>("reason");
s8 = MyjsonArray->Items[i]->GetValue<UnicodeString>("until");
s9 = MyjsonArray->Items[i]->GetValue<UnicodeString>("next_bell");
}
}
编辑
中发布的代码有效,但 GetValue()
方法除外:
s1 = MyjsonStock->GetValue<UnicodeString>(_D("fin_id"));
这给出了 ustring.h
文件中的错误:
'UnicodeString' does not refer to a value
此错误跳转到 UnicodeString
class in ustring.h
的第 28 行。我添加了这个文件的顶部,显示下面的第 28 行。您能否建议更改 GetValue()
方法的调用?
namespace System
{
class TVarRec;
class RTL_DELPHIRETURN Currency;
#if !defined(_DELPHI_NEXTGEN)
class RTL_DELPHIRETURN WideString;
#endif
/////////////////////////////////////////////////////////////////////////////
// UnicodeString: String class compatible with Delphi's Native 'string' type
/////////////////////////////////////////////////////////////////////////////
class RTL_DELPHIRETURN UnicodeString //ERROR JUMPS HERE LINE(28)
{
friend UnicodeString operator +(const char*, const UnicodeString& rhs);
friend UnicodeString operator +(const wchar_t*, const UnicodeString& rhs);
friend UnicodeString operator +(const char16_t*, const UnicodeString& rhs);
friend UnicodeString operator +(const char32_t*, const UnicodeString& rhs);
public:
您对 JSON 的工作原理有误解。我建议您查看 https://www.json.org.
中 JSON 标准定义的语法
您显示的JSON中没有数组。数组用 []
括号表示。对象用 {}
大括号表示。因此,顶级 JSON 值是一个对象,"data“
值是一个对象,"US.NYSE"
是一个对象。因此,2 ParseJSONValue()
调用将同时 return 和 TJSONObject
,而不是 TJSONArray
.
不需要第二次调用 ParseJSONValue()
,因为那些内部 TJSONObject
已经被第一次 ParseJSONValue()
调用解析并且可以在MyjsonFile
。访问这些值时,只需将 GetValue()
的 return 值类型转换为 TJSONObject*
。
此外,您需要 delete
return 由 ParseJSONValue()
编辑的值以避免内存泄漏。
试试这个:
void __fastcall TForm1::Button33Click(TObject *Sender)
{
UnicodeString s1, s2, s3, s4, s5, s6, s7, s8, s9;
std::unique_ptr<TStringStream> jsonstream(new TStringStream);
jsonstream->LoadFromFile(_D("marketstatus1.json"));
std::unique_ptr<TJSONValue> MyjsonValue = TJSONObject::ParseJSONValue(jsonstream->DataString);
TJSONObject* MyjsonFile = static_cast<TJSONObject*>(MyjsonValue.get());
Application->MessageBoxW(MyjsonFile->ToString().c_str(), _D(""), 0);
TJSONObject* MyjsonData = static_cast<TJSONObject*>(MyjsonFile->GetValue(_D("data")));
Application->MessageBoxW(MyjsonData->ToString().c_str(), _D(""), 0);
TJSONObject* MyjsonStock = static_cast<TJSONObject*>(MyjsonData->GetValue(_D("US.NYSE")));
s1 = MyjsonStock->GetValue(_D("fin_id"))->Value();
s2 = MyjsonStock->GetValue(_D("exchange"))->Value();
s3 = MyjsonStock->GetValue(_D("market"))->Value();
s4 = MyjsonStock->GetValue(_D("products"))->Value();
s5 = MyjsonStock->GetValue(_D("local_time"))->Value();
s6 = MyjsonStock->GetValue(_D("status"))->Value();
s7 = MyjsonStock->GetValue(_D("reason"))->Value();
s8 = MyjsonStock->GetValue(_D("until"))->Value();
s9 = MyjsonStock->GetValue(_D("next_bell"))->Value();
}
我正在使用带有 64 位编译器的 C++Builder 10.4.2。我正在尝试解析下面的嵌套 JSON 文件,以便 "US.NYSE"
值位于 TJSONArray
中,然后遍历它们以获取每个数组值。我的代码没有将 "US.NYSE"
放入数组中。你能展示如何将 "US.NYSE"
放入 TJSONArray
中吗?目前,我无法测试 for
循环,这个 for
循环设置是否正确?
{
"data":{
"US.NYSE":{
"fin_id":"US.NYSE",
"exchange":"New York Stock Exchange",
"market":"Canonical",
"products":null,
"local_time":"2020-11-27T11:55:00-05:00",
"status":"Open",
"reason":"Market Holiday - Primary Trading Session (Partial)",
"until":"2020-11-27T12:45:00-05:00",
"next_bell":"2020-11-27T13:00:00-05:00"
}
}
}
void __fastcall TForm1::Button33Click(TObject *Sender)
{
UnicodeString s1, s2, s3, s4, s5, s6, s7, s8, s9;
std::unique_ptr<TStringStream> jsonstream(new TStringStream);
jsonstream->LoadFromFile("marketstatus1.json");
TJSONObject* MyjsonFile = (TJSONObject*)TJSONObject::ParseJSONValue(jsonstream->DataString);
Application->MessageBoxW(MyjsonFile->ToString().w_str(), L"", 0);
TJSONArray* MyjsonArray = (TJSONArray*)TJSONObject::ParseJSONValue(MyjsonFile->GetValue("data")->ToString());
Application->MessageBoxW(MyjsonArray->ToString().w_str(), L"", 0);
int TestCount = MyjsonArray->Count;
for(int i=0; i<MyjsonArray->Count; i++){
s1 = MyjsonArray->Items[i]->GetValue<UnicodeString>("fin_id");
s2 = MyjsonArray->Items[i]->GetValue<UnicodeString>("exchange");
s3 = MyjsonArray->Items[i]->GetValue<UnicodeString>("market");
s4 = MyjsonArray->Items[i]->GetValue<UnicodeString>("products");
s5 = MyjsonArray->Items[i]->GetValue<UnicodeString>("local_time");
s6 = MyjsonArray->Items[i]->GetValue<UnicodeString>("status");
s7 = MyjsonArray->Items[i]->GetValue<UnicodeString>("reason");
s8 = MyjsonArray->Items[i]->GetValue<UnicodeString>("until");
s9 = MyjsonArray->Items[i]->GetValue<UnicodeString>("next_bell");
}
}
编辑
GetValue()
方法除外:
s1 = MyjsonStock->GetValue<UnicodeString>(_D("fin_id"));
这给出了 ustring.h
文件中的错误:
'UnicodeString' does not refer to a value
此错误跳转到 UnicodeString
class in ustring.h
的第 28 行。我添加了这个文件的顶部,显示下面的第 28 行。您能否建议更改 GetValue()
方法的调用?
namespace System
{
class TVarRec;
class RTL_DELPHIRETURN Currency;
#if !defined(_DELPHI_NEXTGEN)
class RTL_DELPHIRETURN WideString;
#endif
/////////////////////////////////////////////////////////////////////////////
// UnicodeString: String class compatible with Delphi's Native 'string' type
/////////////////////////////////////////////////////////////////////////////
class RTL_DELPHIRETURN UnicodeString //ERROR JUMPS HERE LINE(28)
{
friend UnicodeString operator +(const char*, const UnicodeString& rhs);
friend UnicodeString operator +(const wchar_t*, const UnicodeString& rhs);
friend UnicodeString operator +(const char16_t*, const UnicodeString& rhs);
friend UnicodeString operator +(const char32_t*, const UnicodeString& rhs);
public:
您对 JSON 的工作原理有误解。我建议您查看 https://www.json.org.
中 JSON 标准定义的语法您显示的JSON中没有数组。数组用 []
括号表示。对象用 {}
大括号表示。因此,顶级 JSON 值是一个对象,"data“
值是一个对象,"US.NYSE"
是一个对象。因此,2 ParseJSONValue()
调用将同时 return 和 TJSONObject
,而不是 TJSONArray
.
不需要第二次调用 ParseJSONValue()
,因为那些内部 TJSONObject
已经被第一次 ParseJSONValue()
调用解析并且可以在MyjsonFile
。访问这些值时,只需将 GetValue()
的 return 值类型转换为 TJSONObject*
。
此外,您需要 delete
return 由 ParseJSONValue()
编辑的值以避免内存泄漏。
试试这个:
void __fastcall TForm1::Button33Click(TObject *Sender)
{
UnicodeString s1, s2, s3, s4, s5, s6, s7, s8, s9;
std::unique_ptr<TStringStream> jsonstream(new TStringStream);
jsonstream->LoadFromFile(_D("marketstatus1.json"));
std::unique_ptr<TJSONValue> MyjsonValue = TJSONObject::ParseJSONValue(jsonstream->DataString);
TJSONObject* MyjsonFile = static_cast<TJSONObject*>(MyjsonValue.get());
Application->MessageBoxW(MyjsonFile->ToString().c_str(), _D(""), 0);
TJSONObject* MyjsonData = static_cast<TJSONObject*>(MyjsonFile->GetValue(_D("data")));
Application->MessageBoxW(MyjsonData->ToString().c_str(), _D(""), 0);
TJSONObject* MyjsonStock = static_cast<TJSONObject*>(MyjsonData->GetValue(_D("US.NYSE")));
s1 = MyjsonStock->GetValue(_D("fin_id"))->Value();
s2 = MyjsonStock->GetValue(_D("exchange"))->Value();
s3 = MyjsonStock->GetValue(_D("market"))->Value();
s4 = MyjsonStock->GetValue(_D("products"))->Value();
s5 = MyjsonStock->GetValue(_D("local_time"))->Value();
s6 = MyjsonStock->GetValue(_D("status"))->Value();
s7 = MyjsonStock->GetValue(_D("reason"))->Value();
s8 = MyjsonStock->GetValue(_D("until"))->Value();
s9 = MyjsonStock->GetValue(_D("next_bell"))->Value();
}