Delphi JSON总结

 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Delphi是一种开发工具,可以很方便地将JSON数据转换为DataSet。DataSet是Delphi中用于存储和处理数据的组件,而JSON是一种轻量级的数据交换格式。 要快速将JSON数据转换为DataSet,我们首先需要使用DelphiJSON相关工具库来解析JSON数据。Delphi提供了许多用于JSON处理的单元,例如Data.DBXJSON和System.JSON等。 首先,我们需要将JSON数据加载到一个TJSONObject对象中。可以通过使用TJSONObject.ParseJSONValue方法将JSON字符串转换为TJSONValue对象,再将其转换为TJSONObject。然后,我们可以使用TJSONObject的方法和属性来获取JSON数据的各个部分,如键值对、数组和嵌套的JSON对象。 接下来,我们可以创建一个TDataSet对象,如TClientDataSet或TFDMemTable,作为最终的DataSet。然后,我们可以使用TDataSet的FieldDefs属性来定义DataSet的字段结构,以匹配JSON数据的结构。可以根据JSON数据中键值对的名称和类型来定义字段。 一旦字段结构定义完毕,我们可以使用TDataSet的Insert和Edit方法来添加或编辑数据行。可以通过访问TDataSet的Fields属性,然后使用TField的AsInteger、AsFloat、AsString等方法来给字段赋值。 最后,我们可以使用TDataSet的SaveToFile或SaveToStream方法将DataSet保存到文件或流中,以供后续使用或展示。 总结起来,将JSON转换为DataSet的过程如下: 1. 解析JSON数据并创建TJSONObject对象。 2. 创建TDataSet对象,并定义字段结构。 3. 使用TDataSet的Insert和Edit方法添加或编辑数据行,从TJSONObject中获取数据,并赋值给字段。 4. 保存DataSet到文件或流中。 将JSON数据转换为DataSet可以方便地在Delphi中进行数据处理和操作。这种转换方式允许我们以更直观的方式操作和展示数据,同时也提供了方便的数据导入和导出功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈(GuoGuo)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值