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的更多相关文章

  1. Delphi 10.3中使用JSON

    有一个对JSON处理的单元,在你需要使用JSON的单元里面引入"System.json",随后你就可以用Delphi自己的json处理类了. 注意:   1,JSON类创建后,里面 ...

  2. delphi 2010与delphi XE破解版的冲突

    在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...

  3. [转]:Delphi XE中泛型数组的使用范例

    Delphi XE中泛型数组的使用范例,下面的范例简单的使用了泛型字符串数组,如用 TArray 代替 array of Word, 还可以使用 TArray 类提供的算法(就是少了点). uses ...

  4. Delphi XE7中使用JSON

    Delphi XE7有一个对JSON处理的单元,在你需要使用JSON的单元里面引入"System.json",随后你就可以用Delphi自己的json处理类了.我写的小例子只是对包 ...

  5. Delphi 2010 中的泛型

    Delphi 2010 中的泛型 2010已发布很长时间了,口碑还不错,准备用它开发下一项目,但对泛型等新东西的认识还不够,就搜了一下,发现下面这篇文章,还不错,大家一起补补课吧! C++中的模板.C ...

  6. 彻底卸载 RAD Studio 2009/2010/XE

    彻底卸载 RAD Studio 2009/2010/XE: 控制面板-->添加/删除程序中执行了卸载操作以后, 还需要做以下工作: 1. 删除以下目录(注意有些目录是隐藏的): %ALLUSER ...

  7. Delphi 10.2 Tokyo新增JSON类学习——TJsonSerializer

    Delphi 10.3.2 for windows 7 编译通过,源码下载地址: Tokyo 10.2新增类,效率更高更快 TJsonSerializer 需要引用单元:System.JSON.Ser ...

  8. RAD Studio/Delphi 2010 3615下载+破解

    RAD Studio/Delphi 2010 3615下载+破解 官方下载地址: http://altd.embarcadero.com/download/RADStudio2010/delphicb ...

  9. 如何在 在SharePoint 2013/2010 解决方案中添加 ashx (HttpHandler)

    本文讲述如何在 在SharePoint 2013/2010 解决方案中添加 ashx (HttpHandler). 一般处理程序(HttpHandler)是·NET众多web组件的一种,ashx是其扩 ...

随机推荐

  1. shell脚本学习(2)查找

    1 grep 用法: grep -F  fa      找含有fa字符的字符串 yuyuyu@ubuntu:~$ grep -F fa < do.txt grep -i  fa      忽略大 ...

  2. PHP filter_has_var() 函数

    「大理石平台」大理石平台上的裂缝是怎么回事? 定义和用法 filter_has_var() 函数检查是否存在指定输入类型的变量. 如果成功则返回 TRUE,如果失败则返回 FALSE. 语法 filt ...

  3. 硬币问题 (dp,多重背包的二分优化)

    题目描述 给你n种硬币,知道每种的面值Ai和每种的数量Ci.问能凑出多少种不大于m的面值. 输入 有多组数据,每一组第一行有两个整数 n(1≤n≤100)和m(m≤100000),第二行有2n个整数, ...

  4. sequel 远程连接 MySQL 连接错误Can't connect to MySQL server on (61)

    Mac sequel Pro链接时报错Can’t connect to MySQL server on ‘xx.xx.xx.xx’ (61). PS. win版Navicat 报错Can’t conn ...

  5. Redis入门很简单之三【常见参数配置】

    Redis入门很简单之三[常见参数配置] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存中间件memcached  Redis的一下常见设置都是通过对redis.conf ...

  6. Node.js 开发技能图谱

    # Node.js 开发技能图谱 ## Node.js 语言环境搭建 - Node.js 安装(3m大法:nvm.npm.nrm)- Node.js 命令- Node.js开发工具(推荐vscode) ...

  7. html相关操作点

    $( "#members li a" ).bind( "click", function( e ) {} ); $( document ).live( &quo ...

  8. jquery给表格绑值

    jquery给表格绑值 直接上代码了 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  9. JPA单向和双向关系

    单向关系 @JoinColumn 双向关系 @OneToMany @ManyToMany mappedBy

  10. Pytest参数传递

    import pytest@pytest.fixture()def login_r(open_browser):#调用login时,发现需要先打开浏览器,所以改成先打开浏览器,在登陆 print('输 ...