Delphi 2010 XE 中使用 JSON 之 SuperObject68-6

JSON之SuperObject(1);一直盼着Delphi能够直接支持"正则;Delphi2009刚来的时候,有了JSON,但;Delphi2010带了两个相关单元:DBXJS;我想不等了,找第三方吧,真的找到了惊喜:JSON;先来个简单测试:;//SuperObject提倡使用接口;Pars;var;jo:ISuperObject;;begin

--------------------------------------------------------------------------------

JSON 之 SuperObject(1)

一直盼着 Delphi 能够直接支持 "正则表达式" 与 "JSON";

Delphi 2009 刚来的时候, 有了 JSON, 但不好, 那时尝试过一点. 这是以前的链接: 什么是 JSON?

Delphi 2010 带了两个相关单元: DBXJSON、DBXJSONReflect 貌似很强大, 但主要是给 DataSnap 准备的; 尝试了半天, 也很失望: 可能给 DataSnap 网络数据传递够用了, 但太简陋了, 好像是没写完, 对中文支持也有问题.

我想不等了, 找第三方吧, 真的找到了惊喜: JSON – SuperObject v1.1(简介、下载), Henri Gourvest 的大作! 里面还有 XML 相关的一个单元, 慢慢看吧.

先来个简单测试:

//SuperObject 提倡使用接口; ParseString 是 TSuperObject 类的 Class 方法

var

jo: ISuperObject;

begin

jo := TSuperObject.ParseString('{"No1":"张三", "No2":"李四"}');

ShowMessage(jo['No1'].AsString); {张三}

jo := SO('{"No1":"张三", "No2":"李四"}');

ShowMessage(jo['No2'].AsString); //李四

end;

为什么以用接口为主?

我猜是: 一个 JSON 对象中可能包含的子对象太多, 用接口释放比较方便, 因为是自动释放;

另外, Delphi 2010 新给的 IOUntils 单元的功能是用结构的方式给出, 结构也是自释放的;

自动释放! 这会是个方向吗? 不过这样的确会少写很多代码.

JSON 之 SuperObject(2):

SuperObject 构建一个 JSON 的常用方法: 从字符串、从文件、从流.

uses SuperObject;

const JsonStr = '{"No1":"张三", "No2":"李四"}';

//从字符串构建

procedure TForm1.Button1Click(Sender: TObject);

var

jo: ISuperObject;

begin

jo := SO(JsonStr);

{或者用使用下面语句, SO 函数就是调用了 TSuperObject.ParseString}

//jo := TSuperObject.ParseString(JsonStr);

ShowMessage(jo.AsJSon(True, False));

end;

//从文件构建

procedure TForm1.Button2Click(Sender: TObject);

const

path = 'c:\temp\json.txt';

var

jo: ISuperObject;

begin

{产生个测试文件; SuperObject 对中文支持也不太好, 读取它自己保存的文件吧} SO(JsonStr).SaveTo(path); {这就产生并保存了 json 文件}

jo := TSuperObject.ParseFile(path);

ShowMessage(jo.AsJSon(True, False));

end;

//从流构建

procedure TForm1.Button3Click(Sender: TObject);

var

jo: ISuperObject;

stm: TStream;

b: Byte;

begin

{模拟个测试流; 看看它能接受的编码够原始的, 它存取文件也是如此} stm := TStringStream.Create('{"No2":"\u674e\u56db","No1":"\u5f20\u4e09"}');

jo := TSuperObject.ParseStream(stm);

ShowMessage(jo.AsJSon(True, False));

stm.Free;

end;

//AsJSon 的参数

procedure TForm1.Button4Click(Sender: TObject);

var

jo: ISuperObject;

begin

jo := SO(JsonStr);

ShowMessage(jo.AsJSon);

ShowMessage(jo.AsJSon(True));

ShowMessage(jo.AsJSon(True, False));

ShowMessage(jo.AsJSon(False, False));

end;

end.

JSON 之 SuperObject(3): 访问

测试数据提前加入 Memo1 中:

{

"name": "张三", /* 注释 */

"age": 33,

"sex": true,

"weight": 123.456,

"tel": ["86-1111111", "86-2222222"],

"addresses":{"address":"A省B市", "pc":"100001"},

"children": [

{

"name": "张继",

"age": "22",

"sex": true

},

{

"name": "张承",

"age": "11",

"sex": false

}

]

}

代码文件:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Memo1: TMemo;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Button5: TButton;

Button6: TButton;

Button7: TButton;

Button8: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure Button8Click(Sender: TObject);

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

uses SuperObject;

//数组式访问

procedure TForm1.Button1Click(Sender: TObject);

var

jo: ISuperObject;

begin

jo := SO(Memo1.Text);

ShowMessage(jo['name'].AsString);

ShowMessage(jo['age'].AsString);

ShowMessage(jo['sex'].AsString);

ShowMessage(jo['weight'].AsString);

ShowMessage(jo['addresses'].AsString);

ShowMessage(jo['tel'].AsString);

ShowMessage(jo['children'].AsString);

end;

//指定返回类型

procedure TForm1.Button2Click(Sender: TObject);

var

jo: ISuperObject;

s: string;

i: Integer;

d: Double;

b: Boolean;

begin

jo := SO(Memo1.Text);

s := jo['name'].AsString;

i := jo['age'].AsInteger;

b := jo['sex'].AsBoolean;

d := jo['weight'].AsDouble;

ShowMessage(s);

ShowMessage(IntToStr(i));

ShowMessage(BoolToStr(b, True));

ShowMessage(FloatToStr(d));

s := jo.S['name'];

i := jo.I['age'];

b := jo.B['sex'];

d := jo.D['weight'];

ShowMessage(s);

ShowMessage(IntToStr(i));

ShowMessage(BoolToStr(b, True));

ShowMessage(FloatToStr(d));

{

jo['name'] 是 jo.O['name'] 的简化形式, 因为它是类的默认数组; jo.N 类似 jo.O, 区别是 jo.N 在参数不妥时可返回空; jo.M 和方法有关, 对象中可嵌入方法.

}

end;

//内嵌对象访问

procedure TForm1.Button3Click(Sender: TObject);

var

jo: ISuperObject;

begin

jo := SO(Memo1.Text);

ShowMessage(jo['addresses.address'].AsString);

ShowMessage(jo['addresses.pc'].AsString);

end;

//TSuperArray

procedure TForm1.Button4Click(Sender: TObject);

var

Delphi 2010 XE 中使用 JSON 之 SuperObject68-6

 

上一篇:ajax将众多行数组转json传入html页面循环传入table中


下一篇:【题解】力扣1423. 可获得的最大点数