Delphi 解析JSON的方法,就我已知的,有三种:

1. Qjson

2. SuperObject

3. System.JSON   (Delphi XE 自带)

为方便看效果, 使用Delphi 2007演示Qjson和SuperObject的使用,使用Delphi XE 10.1Berlin演示System.JSON的使用。

1. Delphi 2007使用Qjson(uses Qjson)和SuperObjec(uses superobject)生成JSON和解析JSON

界面如下:

选择ISuperObject(节点顺序有点无法把控),生成如下JSON:

{"msg":"Success","datas":[{"age":10,"id":1,"name":"测试1"},{"age":10,"id":2,"name":"测试2"},{"age":10,"id":3,"name":"测试3"},{"age":10,"id":4,"name":"测试4"},{"age":10,"id":5,"name":"测试5"}],"time":"2020-12-03 11:18:08","code":0,"check":true}
    选择Qjson,生成如下JSON:

{
  "code":0,
  "msg":"Success",
  "check":true,
  "datas":[
    {
      "id":1,
      "name":"测试1",
      "age":10
    },
    {
      "id":2,
      "name":"测试2",
      "age":10
    },
    {
      "id":3,
      "name":"测试3",
      "age":10
    },
    {
      "id":4,
      "name":"测试4",
      "age":10
    },
    {
      "id":5,
      "name":"测试5",
      "age":10
    }
  ],
  "time":"2020-12-03 11:19:08"
}
    可以采用Qjson解析,也可以选择ISuperObject解析:

窗体代码如下:

unit uFrmMain;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, superobject, qjson;
 
const
  fmt= '{"id": %d, "name": "测试%d", "age": %d}';
  icount= 5;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    GroupBox1: TGroupBox;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    Button2: TButton;
    Memo1: TMemo;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure RadioButton2Click(Sender: TObject);
    procedure RadioButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    FType: Integer;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  json: ISuperObject;
  jsonArr: TSuperArray;
  js, jsArr: TQJson;
  I: Integer;
begin
  Memo1.Lines.Clear;
  case FType of
    0: begin
      json:= SO();
      json.S['time']:= FormatDateTime('yyyy-MM-dd hh:mm:ss', Now);
      json.B['check']:= True;
      json['datas']:= SA([]);
      for I := 1 to icount do
        json.A['datas'].Add(SO(format(fmt, [I, I, 10])));
      json.S['msg']:= 'Success';
      json.I['code']:= 0;
      Memo1.Lines.Text:= json.AsString;
    end;
    1: begin
      js:= TQJson.Create;
      try
        js.AddVariant('code', 0);         //等价于 js.Add('code').AsInteger:= 0;
        js.AddVariant('msg', 'Success');  //等价于 js.Add('msg').AsString:= 'Success';
        js.AddVariant('check', True);     //等价于 js.Add('check').AsBoolean:= True;
        jsArr:= js.AddArray('datas');
        for I := 1 to icount do
        begin
          /// <summary>添加一个数组</summary>
          /// <param name="AName">要添加的对象的结点名称</param>
          /// <param name="AItems">要添加的数组内容</param>
          /// <returns>返回创建的结点实例</returns>
          jsArr.Add('', format(fmt, [I, I, 10]));
        end;
        js.AddVariant('time', FormatDateTime('yyyy-MM-dd hh:mm:ss', Now));
        Memo1.Lines.Text:= js.AsString;
      finally
        FreeAndNil(js);
      end;
    end;
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  json: ISuperObject;
  jsonArr: TSuperArray;
  js, jsArr: TQjson;
  I: Integer;
  sJson: string;
  lst: TStringList;
begin
  sJson:= Memo1.Lines.Text;
  case FType of
    0: begin
      json:= SO(sJson);
      if json= nil then
        Exit;
      lst:= TStringList.Create;
      try
        lst.Add(Format('%u', [json.I['code']]));
        if json.B['check'] then
          lst.Add('True')
        else
          lst.Add('False');
        lst.Add(json.S['msg']);
        jsonArr:= json.O['datas'].AsArray;
        for I := 0 to jsonArr.Length - 1 do
          lst.Add(Format('%u %s %u', [jsonArr.O[I].I['id'], jsonArr.O[I].S['name'], jsonArr.O[I].I['age']]));
        lst.Add(json.S['time']);
        showmessage(lst.text);
      finally
        FreeAndNil(lst);
      end;
    end;
    1: begin
      js:= TQJson.Create;
      lst:= TStringList.Create;
      try
        js.Parse(sJson);
        lst.Add(Format('%d', [js.IntByName('code', -1)]));
        if js.BoolByName('check', false) then
          lst.Add('True')
        else
          lst.Add('False');
        lst.Add(js.ValueByName('msg', ''));
        jsArr:= js.ItemByName('datas');
        for I := 0 to jsArr.Count - 1 do
          lst.Add(Format('%u %s %u', [jsArr.Items[I].IntByName('id', 0)
            , jsArr.Items[I].ValueByName('name', '')
            , jsArr.Items[I].IntByName('age', 0)]));
        lst.Add(js.ValueByName('time', ''));
        ShowMessage(lst.Text);
      finally
        FreeAndNil(js);
        FreeAndNil(lst);
      end;
    end;
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  FType:= 0;
end;
 
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
  FType:= 1;
end;
 
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
  FType:= 0;
end;
 
end.
2. Delphi XE 10.1 Berlin 使用TJSONObject(uses System.JSON)生成JSON和解析JSON

界面如下:

生成如下JSON:

{"code":0,"msg":"Success","check":true,"datas":["{\"id\":1,\"name\":\"测试1\",\"age\":10}","{\"id\":2,\"name\":\"测试2\",\"age\":10}","{\"id\":3,\"name\":\"测试3\",\"age\":10}","{\"id\":4,\"name\":\"测试4\",\"age\":10}","{\"id\":5,\"name\":\"测试5\",\"age\":10}"],"time":"2020-12-03 11:26:12"}
    解析效果:

窗体代码如下:

unit uFrmMain;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.JSON;
 
const
  fmt= '{"id":%d,"name":"测试%d","age":%d}';
  icount= 5;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    GroupBox1: TGroupBox;
    RadioButton2: TRadioButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  js: TJSONObject;
  jsArr: TJSONArray;
  I: Integer;
begin
  Memo1.Lines.Clear;
  js:= TJSONObject.Create;
  jsArr:= TJSONArray.Create;
  try
    js.AddPair('code', TJSONNumber.Create(0));     //TJSONNumber支持Double、Integer、Int64
    js.AddPair('msg', 'Success');                  //默认字符
    js.AddPair('check', TJSONTrue.Create);         //boolean类型  TJSONTrue TJSONFalse
    for I := 1 to icount do
      jsArr.Add(format(fmt, [I, I, 10]));
    js.AddPair('datas', jsArr);
    js.AddPair('time', FormatDateTime('yyyy-MM-dd hh:mm:ss', Now));
    Memo1.Lines.Add(js.ToString);
  finally
    js:= nil;
    jsArr:= nil;
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  js, jsItem: TJSONObject;
  jsArr: TJSONArray;
  item: TJSONValue;
  I: Integer;
  sJson: string;
  lst: TStringList;
begin
  sJson:= Memo1.Lines.Text;
  if sJson= '' then
    Exit;
  lst:= TStringList.Create;
  try
    js:= (TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(sJson), 0)) as TJSONObject;
    lst.Add(js.GetValue('code').Value);
    lst.Add(js.GetValue('msg').Value);
    if js.GetValue('check') is TJSONTrue then
      lst.Add('True')
    else
      lst.Add('False');
    jsArr:= js.GetValue('datas') as TJSONArray;
    for I := 0 to jsArr.Size- 1 do
    begin
      //jsArr.Get(I) as TJSONObject 竟然报错Invalid class typecast 不知道什么原因
      jsItem:= (TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(jsArr.Get(I).Value), 0)) as TJSONObject;
      lst.Add(Format('%d %s %d', [
        (jsItem.GetValue('id') as TJSONNumber).AsInt,
        jsItem.GetValue('name').Value,
        (jsItem.GetValue('age') as TJSONNumber).AsInt]));
    end;
    lst.Add(js.GetValue('time').Value);
    ShowMessage(lst.Text);
  finally
    FreeAndNil(lst);
  end;
end;
 
end.
————————————————
版权声明:本文为CSDN博主「ceaningking」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ceaningking/article/details/110522777

Delphi JSON总结相关推荐

  1. delphi json

    在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包 ...

  2. delphi JSON用法

    1.引用:uses TJSONObject; 1 json := TJSONObject.create; 2 json.addPair('姓名','张三'); 3 json.addPair('年龄', ...

  3. 【delphi】 JSON 操作详解(TJSONObject)

    Delphi官方提供的对于JSON操作的单元是:system.JSON,delphi将JSON元素都定义为对象,注意是对象,既然是对象就需要创建,需要释放.具体如下: 本文演示 Demo 下载:SZH ...

  4. delphi和python比较_Python For Delphi---更好地协同

    先上相关资源的下载吧: python4delphi: 主页: http://code.google.com/p/python4delphi/ 下载: svn checkout http://pytho ...

  5. delphi 解析json java_Delphi处理JSON格式数据

    1 下载/安装组件uLkJSON.pas 2 下载/安装组件strprocess.pas uses SuperObject,uLkJSON,strprocess; //POST JSON数据格式的请求 ...

  6. Delphi中JSon SuperObject 使用:数据集与JSON对象互转

    在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包 ...

  7. Delphi语言最好的JSON代码库 mORMot学习笔记1

    mORMot没有控件安装,直接添加到lib路径, 工程中直接添加syncommons,syndb等到uses里 -------------------------------------------- ...

  8. delphi 实体类 JSON 数组

    delphi 实体类 与JSON转换,序列化 TJson REST.JSON.pas System.JSON.Serializers, TJson.JsonToObject TJson.ObjectT ...

  9. JSON与Delphi Object的互换

    JSON与Delphi Object的互换 转载于:https://www.cnblogs.com/LittleTiger/p/7020329.html

  10. delphi解析json(解决乱码问题)

    delphi解析json(解决乱码问题) 参考文章: (1)delphi解析json(解决乱码问题) (2)https://www.cnblogs.com/figofifa/p/6612901.htm ...

最新文章

  1. postgresql导入mysql的备份_PostgreSQL数据备份、导入转
  2. DB2数据库常用工具
  3. 《Ext详解与实践》节选:文件上传
  4. 学习deercao的正则笔记
  5. 各企业正在纷纷向“云”,背后有着哪些原因?
  6. maven的java web项目启动找不到Spring ContextLoaderListener的解决办法
  7. VC----SDK下对窗口非客户区的操作
  8. SVD在推荐系统中的应用
  9. python千行代码项目_p2:千行代码入门python
  10. 英雄多少钱steam_Steam农历新年特卖:越来越火热的中国单机游戏市场 | 游戏干线...
  11. intellij idea参数提示param hints
  12. 找出数列中个数大于总数一半的元素(编程之美2.3)
  13. 面试美团,面试官突然问我 Java “锁” ,我哭了
  14. USB转TTL、USB转串口、USB转RS232的区别
  15. pdf书籍笔记助手,BookxNote使用记录
  16. SylixOS移植Redis库总结
  17. 百度音乐高调改名后 掉队的千千音乐还有机会吗?
  18. thymeleaf渲染搜索页面(template: “class path resource [templates/serach.html]“)-serach2021-09-23
  19. 跟谁学 英语口语20090927疑问句
  20. 有了繁难字库生僻字不用造(一)

热门文章

  1. 局域网互传文件工具_win10一键共享工具免费版(快速解决局域网文件共享问题)官方版...
  2. STM32+MFRC522完成IC卡号读取、密码修改、数据读写
  3. Kali Linux镜像安装(1)
  4. python解释器的下载与安装
  5. 菜鸟教程java在线编辑器_HTML 编辑器
  6. 服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
  7. iphone长截图哪个软件好_看完长知识了!苹果手机也能截长图,原来iPhone截屏还能这样玩...
  8. 记录下我磕磕碰碰的三个月找工作经历,BAT大厂面试总结
  9. VISIO画立体图——VISIO画图技巧
  10. 8、Python车牌数据集自动生成及其图片叠加