JSON

JSON 解析和生成, TJSONValue, TJSONObject, TJSONPair, TJSONAr(2)

字号+ 作者:H5之家 来源:H5之家 2017-07-22 16:00 我要评论( )

如果从 TJSONObject 里面读取键名为 KeyName 的键值来,可以用: TJSONValue *lpKeyValue = lpJSONObject- Values[LKeyName]; 得到的是 lpKeyValue,这可能是一个结构体、数组、或者一个简单的数值。 int iPairCoun

  如果从 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:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • golang json的大小写技巧

    golang json的大小写技巧

    2017-07-22 16:06

  •  WinJS实用开发技巧(1):XML转JSON

    WinJS实用开发技巧(1):XML转JSON

    2017-07-22 15:03

  • Golang中使用JSON的一些小技巧

    Golang中使用JSON的一些小技巧

    2017-07-22 09:01

  • PHP API接口必备之输出json格式数据示例教程

    PHP API接口必备之输出json格式数据示例教程

    2017-07-21 17:00

网友点评
s