zoukankan      html  css  js  c++  java
  • 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: empjson.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":"u674eu56db","No1":"u5f20u4e09"}');

    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

  • 相关阅读:
    influxdb服务器 relay
    browse-agent type and curl post
    使用 Ansible 管理 MySQL 复制
    ansible里的item和with_items
    Ansible 从MySQL数据库添加或删除用户
    ansibel---tag模块
    ll | wc -l的陷阱
    ansible 判断和循环
    Ansible详解(二)
    Ansible详解(一)
  • 原文地址:https://www.cnblogs.com/blogpro/p/11452536.html
Copyright © 2011-2022 走看看