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. MariaDB Where子句

    WHERE 子句过滤各种语句,如SELECT,UPDATE,DELETE和INSERT. 他们提出了用于指定行动的标准. 它们通常出现在语句中的表名后面,其条件如下. WHERE子句本质上像一个if语 ...

  2. Ceph中PG和PGP的区别

    http://www.zphj1987.com/2016/10/19/Ceph%E4%B8%ADPG%E5%92%8CPGP%E7%9A%84%E5%8C%BA%E5%88%AB/ 一.前言 首先来一 ...

  3. MDK(keil)4.7中文注释乱码解决

    由于编码使用不统一导致别的开发环境下的文件在MDK(keil)下打开中文显示乱码,解决这一问题需要进行码制转换, 可以先将欲打开的文件转换成UTF-8格式(如在notepad中进行转换),也可以在打开 ...

  4. Andrdoid中对应用程序的行为拦截实现方式之----从Java层进行拦截

    致谢: 感谢 简行之旅的这篇blog:http://blog.csdn.net/l173864930/article/details/38455951,这篇文章是参考这篇blog的进行一步一步操作的, ...

  5. vSphere Client部署OVA失敗:無效:SHA256(xxxxxxx.ovf)。

    通過vSphere Client部署OVA失敗. 您會看到此錯誤:OVF包無效,無法部署.以下清單文件條目(第1行)無效:SHA256(xxxxxxx.ovf). 原因 出現此問題的原因是vSpher ...

  6. sqlserver2008新建查询,表名下出现红波浪线,显示“表名无效”,但仍然可以查询得到结果(转)

    转:http://zhidao.baidu.com/link?url=82Xf_uK9VgIeYM_1kczmvKhiEQKLCqhN4_Tfe_cvriqkeP7Wggy5D60VTnMxFREwz ...

  7. API参考文档

    Android 中文版:http://www.apiref.com/android-zh/index.html Bootstrap3 教程:http://www.apiref.com/bootstra ...

  8. jquery+javascript触发a标签的点击事件

    今天项目经理跟我说window.open()在一些浏览器上会被拦截,当时的解决方案是:用a标签的target="_blank"属性也可以打开窗体页面 于是解决了A问题出现了B问题: ...

  9. Hive 时间操作函数(转)

    1.日期函数UNIX时间戳转日期函数: from_unixtime 语法:   from_unixtime(bigint unixtime[, string format]) 返回值: string ...

  10. strcpy函数学习

    strcpy的功能如下: 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string.h> 和 #includ ...