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. linux su su-的区别

    su只是切换用户. su - 切换用户并切换shell环境. su another pwd后为/home/current su - another pwd后为/home/another

  2. mysql学习-join的使用

    sql的执行顺序是从from 开始 join图

  3. SCP-bzoj-1019

    项目编号:bzoj-1019 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 对于一个hanoi,知道了各种移动操作的优先级,也就确定了方案.可以证明对于盘子数为N的hanoi,任意移动方案都 ...

  4. sql存储过程循环实现事务

    //往一张表中添加数据,获取添加数据生成的ID,再往另一张表中添加多条数据 ALTER PROCEDURE [dbo].[AttendanceCardAndDetail_Add] @SchoolID ...

  5. mysql5.6配置-my

    # mkdir -p /home/mysql/3306/{data,binlog,logs} [client] port = socket=/tmp/my3306.sock [mysql] no-au ...

  6. [CSP-S模拟测试]:抛硬币(DP)

    题目背景 小$A$和小$B$是一对好朋友,他们经常一起愉快的玩耍.最近小$B$沉迷于**师手游,天天刷本,根本无心搞学习.但是小$B$已经入坑了几个月,却一次都没有抽到$SSR$,让他非常怀疑人生.勤 ...

  7. [NOIP模拟测试34]反思+题解

    不要陷入思维定势,如果长时间没有突破就要考虑更改大方向. 不要把简单问题复杂化. 做完的题就先放下,不管能拿多少分.不能过一段时间就回来调一下. $Solutions:$ A.次芝麻 因为$n+m$始 ...

  8. leetcode上回溯法的使用

    17 93 131 46(全排列) class Solution { public: vector<vector<int>> permute(vector<int> ...

  9. java BufferSegment

    package org.rx.util; import java.util.function.Consumer; import static org.rx.core.Contract.require; ...

  10. 33-python基础-python3-列表插入元素-insert()方法-append()方法-extend()方法

    1-insert()方法 insert()方法可以在列表任意下标处插入一个值. insert()方法的第一个参数是新值的下标,第二个参数是要插入的新值. 2-append()方法 调用 append( ...