如果从 TJSONObject 里面读取键名为 KeyName 的键值来,可以用:
TJSONValue *lpKeyValue = lpJSONObject- >Values[L"KeyName"];
得到的是 lpKeyValue,这可能是一个结构体、数组、或者一个简单的数值。
int iPairCount = lpJsonObject->Count; // 结构体里面一共有这些对键名/键值
TJSONPair *lpPair = lpJsonObject->Pairs[i]; // lpPair = 第 i 对键名/键值
UnicodeString sKeyName = lpPair->JsonString->Value(); // lpPair 的键名
TJSONValue *lpKeyValue = lpPair->JsonValue; // lpPair 的键值
TJSONPair
TJSONPair 是一对键名/键值,TJSONPair 经常用到的属性:
JsonString: 是 TJSONString * 类型的,储存的键名,一般可以用 lpPair->JsonString->Value(); 得到 lpPair 的键名
JsonValue: 是 TJSONValue * 类型的,这个键值可能是结构体、数组、或者一个简单的数值。
TJSONArray
TJSONArray 是一组键值,都是使用 TJSONValue * 储存的,Count 是键值的个数,Items[i] 是第 i 个键值。
for(int i=0; i<lpArray->Count; i++)
{
TJSONValue *lpItem = lpArray->Items[i];
// lpItem 可能是结构体、数组、或者简单的值
}
TJSONString
TJSONString 是一个简单的字符串值,用 Value() 获得字符串值。
TJSONNumber
TJSONNumber 是一个简单的数值,用 AsInt, AsInt64, AsDouble 获取整数或浮点数值,也可以用 Value() 获取值的字符串
TJSONBool / TJSONTrue / TJSONFalse
TJSONBool 是一个简单的布尔值,用 AsBoolean 获取 bool 值,也可以用 Value() 获取值的字符串。
TJSONBool 储存的值,可能是它的子类 TJSONTrue 或 TJSONFalse 之一,用 dynamic_cast 可以转换或判断。
TJSONNull
TJSONNull 是一个空值,它的成员 Value() 为从父类继承过来的,获取到空的字符串。
枚举 JSON 里面所有的值,JSON 的整体结构
void TForm1::EnumJsonValues(TJSONValue *lpJsonValue, UnicodeString sKeyName)
{
TJSONObject *lpJsonObject = dynamic_cast<TJSONObject *>(lpJsonValue);
if(lpJsonObject) // 结构体
{
for(int iPairIdx=0; iPairIdx<lpJsonObject->Count; iPairIdx++)
{
TJSONPair *lpPair = lpJsonObject->Pairs[iPairIdx]; // 第 iPairIdx 对键名/键值
UnicodeString sName = lpPair->JsonString->Value(); // 第 iPairIdx 对键名
TJSONValue *lpValue = lpPair->JsonValue; // 第 iPairIdx 对键值
// 不知道 lpValue 这个值是什么类型的,进一步枚举值,需要递归
EnumJsonValues(lpValue, sKeyName.IsEmpty()?sName:sKeyName+L"."+sName);
}
return;
}
TJSONArray *lpJsonArray = dynamic_cast<TJSONArray *>(lpJsonValue);
if(lpJsonArray) // 数组
{
for(int i=0; i<lpJsonArray->Count; i++) // 枚举数组里面每个元素
{
TJSONValue *lpValue = lpJsonArray->Items[i]; // 数组里面第 i 个元素
// 不知道 lpValue 这个值是什么类型的,进一步枚举值,需要递归
EnumJsonValues(lpValue, sKeyName+L"["+IntToStr(i)+L"]");
}
return;
}
// 既不是结构体,也不是数组,而是简单的单一值,可以直接输出
UnicodeString sKeyValue = lpJsonValue->Value(); // sKeyName 的值就是 lpJsonValue
Memo2->Lines->Add(sKeyName + L" = " + sKeyValue);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TJSONValue *lpJson = TJSONObject::ParseJSONValue(Memo1->Text);
if(lpJson)
{
EnumJsonValues(lpJson, L"");
delete lpJson;
}
}
//---------------------------------------------------------------------------
运行结果:
生成 JSON 字符串/文件
例1: