Json是一种轻量级传输数据格式,广泛应用互联网和各应用中。json主要採用键值对来表示数据项。多个数据项之间用逗号分隔,也能够用于数组。以下注重介绍一下在delphi中使用json,在delphi中使用json经常使用superobject单元文件。该文件能够在网上下载,最初接触json是在2011年,好久没用这不刚好有项目要用到又折腾了好久,以下做了一个简单的Demo,方便以后忘了能随时查看。详细的json使用能够參看万一老师的博客,记录的非常详细,以下的demo主要是将数据库记录转换为json格式,然后进行解析。详细源代码例如以下。

新建一个delphi应用程序,在窗口上放置table组件,连接数据DBDEMOS。连接表customer.db,active设置为true。

详细文件例如以下:

delphiproject文件例如以下

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

单元文件例如以下:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;

type
  TForm1 = class(TForm)
    mmo1: TMemo;
    tbl1: TTable;
    ds1: TDataSource;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses  superobject;

procedure TForm1.btn1Click(Sender: TObject);
var
  jo,jt:ISuperObject;
begin
  jo:=SO();
  jt:=SO();
  jo.S['xm']:='张三';
  jo.I['age']:=25;
  jo.S['sex']:='男';
  jt.O['person']:=jo;
  ShowMessage(jt.AsString);
  ShowMessage(jt.O['person'].S['xm']);
end;

procedure TForm1.btn2Click(Sender: TObject);
var
  i:Integer;
  jfields,jitems,jo:ISuperObject;
begin
  mmo1.Clear;
  jitems:=SA([]);
  jo:=SO();
  with tbl1 do
  begin
    First;
    while not eof do
    begin

      jfields:=SO();
      for i:=0 to FieldCount-1 do
      begin
        if Fields[i].DataType=ftDateTime then
         jfields.S[Fields[i].FieldName]:=FormatDateTime('yyyy-mm-dd hh:mm:ss',Fields[i].AsDateTime)
        else
         jfields.S[Fields[i].FieldName]:=Fields[i].AsString;
      end;
      jitems.AsArray.Add(jfields);
      Next;
    end;
  end;
  jo.O['records']:=jitems;
  mmo1.Lines.Add(jo.AsString);
end;

procedure TForm1.btn3Click(Sender: TObject);
var
  jo,m:ISuperobject;
  i,j:Integer;
  tt:TSuperArray;
  s:string;
  lst:TStringList;
begin
  if mmo1.Text<>'' then
  begin
    lst:=TStringList.Create;
    jo:=so(mmo1.Text);
    tt:=jo.O['records'].AsArray;
    for i:=0 to tt.Length-1 do
    begin
      s:='';
      for j:=0 to tbl1.FieldCount-1 do
      begin
       if s='' then
        s:=tt.O[i].S[tbl1.Fields[j].FieldName]
       else
        s:=s+' '+tt.O[i].S[tbl1.Fields[j].FieldName]
      end;
      lst.Add(s);
    end;
    ShowMessage(lst.Text) ;
    lst.Free;
  end;
end;

end.

dfm文件例如以下:

object Form1: TForm1
  Left = 312
  Top = 70
  Width = 410
  Height = 382
  Caption = 'json读写'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object mmo1: TMemo
    Left = 0
    Top = 0
    Width = 394
    Height = 249
    Align = alTop
    TabOrder = 0
  end
  object btn1: TButton
    Left = 23
    Top = 264
    Width = 75
    Height = 25
    Caption = '简单读写'
    TabOrder = 1
    OnClick = btn1Click
  end
  object btn2: TButton
    Left = 121
    Top = 264
    Width = 105
    Height = 25
    Caption = '读数据库记录'
    TabOrder = 2
    OnClick = btn2Click
  end
  object btn3: TButton
    Left = 253
    Top = 263
    Width = 75
    Height = 25
    Caption = '解析json'
    TabOrder = 3
    OnClick = btn3Click
  end
  object tbl1: TTable
    Active = True
    DatabaseName = 'DBDEMOS'
    TableName = 'customer.db'
    Left = 288
    Top = 152
  end
  object ds1: TDataSource
    DataSet = tbl1
    Left = 104
    Top = 176
  end
end

当中有些版本号superobject的hash方法有编译指令,我使用时报错,将其去掉改为例如以下:

class function TSuperAvlEntry.Hash(const k: SOString): Cardinal;
var
  h: cardinal;
  i: Integer;
begin
  h := 0;
  for i := 1 to Length(k) do
    h := h*129 + ord(k[i]) + $9e370001;
  Result := h;
end;

程序执行结果例如以下:

点击简单读写

读数据库记录

解析json

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhlbmdodWkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

superobject单元还提供了很多方法,在此不一一列举使用,以后使用中再慢慢总结。

Delphi中Json格式读写的更多相关文章

  1. 关于http接口开发中json格式数据编码问题处理

    关于http接口开发中json格式数据编码问题处理 在实际工作中,接口很多时候返回json格式,但有时返回的格式会有编码问题 假设如下接口:http://service.test.com/interf ...

  2. python中json格式数据输出实现方式

    python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ...

  3. Go net/http获取body中json格式数据

    Go net/http获取body中json格式数据 package main import ( "encoding/json" "fmt" "io/ ...

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

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

  5. ABAP 中JSON格式的转换与解析

    RT,JSON是当今十分流行的一种轻量数据格式,广泛地应用于各种数据交换场景中.本文会介绍一种比较简单的将ABAP中的数据转换为JSON格式的方法. (如果你是因为引号的问题搜索到了这篇文章,请直接拉 ...

  6. SpringMVC前后台数据传递中Json格式的相互转换(前台显示格式、Json-lib日期处理)及Spring中的WebDataBinder浅析

    两个方向: 一.前台至后台: Spring可以自动封装Bean,也就是说可以前台通过SpringMVC传递过来的属性值会自动对应到对象中的属性并封装成javaBean,但是只能是基本数据类型(int, ...

  7. jmeter 导入csv数据中json格式数据取值不完整

    1.jmeter中添加csv数据文件时,数据是json格式 2.jmeter中执行取值发现只取了一部分 分析原因,json格式数据,中间有逗号,而csv是根据逗号来分割的,这回导致我们取值错位. 解决 ...

  8. delphi 解析Json格式(转自:http://blog.csdn.net/jayqiang/article/details/7066824)

    SuperObject 是开源的 Delphi 的 JSON 工具包,可生成 JSON 数据以及进行 JSON 解析. unit Unit6; interface uses Windows, Mess ...

  9. 页面中 json 格式显示 数据

    在页面中,有时候我们需要的不仅仅是将数据显示出来,而且要以以 json 的格式显示数据,如显示接口的时候 我们需要如下显示 这个时候,主要用到了 <pre> 标签 $.get(" ...

随机推荐

  1. springmvc添加拦截器

    springmvc.xml配置如下: 除了 sysFile 下的所有接口,以及user下的loginUser接口,其他的所有接口都会经过拦截器UserInterceptor处理 <mvc:int ...

  2. APC注入(Ring3)

    首先简单介绍一下APC队列和Alertable. 看看MSDN上的一段介绍(https://msdn.microsoft.com/en-us/library/ms810047.aspx): The s ...

  3. Android开发 ---从互联网上下载文件,回调函数,图片压缩、倒转

     Android开发 ---从互联网上下载文件,回调函数,图片压缩.倒转 效果图: 描述: 当点击“下载网络图像”按钮时,系统会将图二中的照片在互联网上找到,并显示在图像框中 注意:这个例子并没有将图 ...

  4. 强化学习9-Deep Q Learning

    之前讲到Sarsa和Q Learning都不太适合解决大规模问题,为什么呢? 因为传统的强化学习都有一张Q表,这张Q表记录了每个状态下,每个动作的q值,但是现实问题往往极其复杂,其状态非常多,甚至是连 ...

  5. L259 合同

    We are satisfied with the terms of this contract for the most part, but we feel that your terms of p ...

  6. 记一次给nginx的web服务器目录加软链接

    先期情况和问题 已安装好nginx服务器和相关配置.nginx的web目录是/usr/share/nginx/html. 现在的问题是希望把web目录换成/root/nginx/html/,但是不更改 ...

  7. android 8.0 intent安装apk失败屏幕闪过

    需要做两处设置: 1.android8.0要加一条权限: <uses-permission android:name="android.permission.REQUEST_INSTA ...

  8. 多进程于多线程的区别,cpu密集型适合用什么

    多线程:在单个程序中同事运行多少个线程完成不同的工作,成为线程. 线程共享内存空间,进程的内存是独立的, 同一个进程的线程间可以直接交流: 两个进程想通信,必须通过一个中间代理来实现, 一个线程可以控 ...

  9. angular 学习日志

    1.创建项目 npm install -g @angular/cli ng new my-app cd my-app ng serve --open // 或者 npm start 2.生成新模块 n ...

  10. LazyMan的实现

    题目如下: 实现一个LazyMan,可以按照以下方式调用: LazyMan(“Hank”)输出: Hi! This is Hank! LazyMan(“Hank”).sleep(10).eat(“di ...