// SUPEROBJECT 序列数据集 cxg 2017-1-12
// {"data":[{"c1":1,"c2":1}]};
// DELPHI7 适用

unit superobjectDB;

interface

uses
SysUtils, db, DBClient, superobject, EncdDecd, Classes, Httpapp;

// {"data":[{"c1":1,"c2":1}]};
function datasetToJson(dataset: TDataSet): string;

procedure jsonToDataset(const json: string; dataset: TDataSet);
// {"cols":[{"name":"c1","size":0,"type":"int"}]"data":[{"c1":1}]};

function datasetToJson2(dataset: TDataSet): string;

implementation

procedure jsonToDataset(const json: string; dataset: TDataSet);
var
jo, jf: ISuperObject;
i, j: Integer;
ja: TSuperArray;
field: TField;
blob: TStringStream;
begin
if (dataset = nil) or (not dataset.Active) then
Exit;
jo := SO(json);
ja := jo.A['data'];
dataset.DisableControls;
try
for i := 0 to ja.Length - 1 do
begin
dataset.Append;
jf := ja.O[i];
if jf = nil then
Continue;
for j := 0 to dataset.FieldCount - 1 do
begin
field := dataset.Fields[j];
if field = nil then
Continue;
case field.datatype of
ftBoolean:
field.AsBoolean := jf[field.FieldName].AsBoolean;
ftFloat, ftBCD:
field.AsFloat := jf[field.FieldName].AsDouble;
ftCurrency:
field.AsCurrency := jf[field.FieldName].AsCurrency;
ftSmallint, ftInteger, ftWord, ftAutoInc:
field.AsInteger := jf[field.FieldName].AsInteger;
ftString, ftFixedChar, ftMemo, ftWideString:
field.AsString := HTTPDecode(jf[field.FieldName].AsString);
ftTimeStamp, db.ftDate, ftTime, ftDateTime:
field.AsDateTime := jf[field.FieldName].AsDouble;
ftBytes, ftVarBytes, DB.ftBlob, ftGraphic, ftOraBlob, ftOraClob:
begin
blob := TStringStream.Create(DecodeString(jf[field.FieldName].AsString));
try
TBlobField(field).LoadFromStream(blob);
finally
blob.Free;
end;
end;
end;
end;
dataset.Post;
end;
finally
dataset.EnableControls;
end;
end;

function datasetToJson(dataset: TDataSet): string;
var
i: Integer;
jo, ja, jf: ISuperObject;
fld: TField;
blob: TStringStream;
begin
Result := '{"return":"null"}';
if (dataset = nil) or (not dataset.Active) then
Exit;
jo := SO();
ja := SA([]);
dataset.First;
while not dataset.Eof do
begin
jf := SO();
for i := 0 to dataset.FieldCount - 1 do
begin
fld := dataset.Fields[i];
if fld.IsNull then
jf.S[fld.FieldName] := ''
else
begin
case fld.DataType of
ftBoolean:
jf.B[fld.FieldName] := fld.AsBoolean;
ftSmallint, ftInteger, ftWord, ftAutoInc:
jf.I[fld.FieldName] := fld.AsInteger;
ftLargeint:
jf.I[fld.FieldName] := TLargeintField(fld).AsLargeInt;
ftCurrency:
jf.C[fld.FieldName] := fld.AsCurrency;
ftFloat, ftBCD:
jf.D[fld.FieldName] := fld.AsFloat;
ftTimeStamp, db.ftDate, ftTime, ftDateTime:
jf.D[fld.FieldName] := fld.AsDateTime;
ftString, ftFixedChar, ftMemo, ftWideString:
jf.S[fld.FieldName] := HttpEncode(fld.AsString);
ftBytes, ftVarBytes, DB.ftBlob, ftGraphic, ftOraBlob, ftOraClob:
begin
blob := TStringStream.Create('');
try
TBlobField(fld).SaveToStream(blob);
jf.S[fld.FieldName] := EncodeString(blob.DataString); // base64 encode
finally
blob.Free;
end;
end;
end;
end;
end;
ja.AsArray.Add(jf);
dataset.Next;
end;
jo.O['data'] := ja;
Result := jo.AsString;
end;

function datasetToJson2(dataset: TDataSet): string;
var
i: Integer;
jo, ja, jf, jo2, ja2: ISuperObject;
fld: TField;
blob: TStringStream;

function _getFieldType(fld: TField): string;
begin
case fld.DataType of
ftBoolean: Result := 'bool';
ftSmallint, ftInteger, ftWord, ftAutoInc: Result := 'int';
ftLargeint: Result := 'int64';
ftCurrency: Result := 'currency';
ftFloat, ftBCD: Result := 'float';
ftTimeStamp, db.ftDate, ftTime, ftDateTime: Result := 'datetime';
ftString, ftFixedChar, ftMemo, ftWideString: Result := 'string';
ftBytes, ftVarBytes, DB.ftBlob, ftGraphic, ftOraBlob, ftOraClob: Result := 'blob';
end;
end;

begin
// {"cols":[{"name":"c1","size":0,"type":"int"}]"data":[{"c1":1}]};
Result := '{"return":"null"}';
if (dataset = nil) or (not dataset.Active) then
Exit;
jo := SO();
// cols
ja2 := SA([]);
dataset.First;
for i := 0 to dataset.FieldCount - 1 do
begin
fld := dataset.Fields[i];
jo2 := SO();
jo2.S['name'] := fld.FieldName;
jo2.I['size'] := fld.Size;
jo2.S['type'] := _getFieldType(fld);
jo2.B['required'] := fld.Required;
jo2.B['readonly'] := fld.ReadOnly;
ja2.AsArray.Add(jo2);
end;
jo.O['cols'] := ja2;
// data
ja := SA([]);
dataset.First;
while not dataset.Eof do
begin
jf := SO();
for i := 0 to dataset.FieldCount - 1 do
begin
fld := dataset.Fields[i];
if fld.IsNull then
jf.S[fld.FieldName] := ''
else
begin
case fld.DataType of
ftBoolean:
jf.B[fld.FieldName] := fld.AsBoolean;
ftSmallint, ftInteger, ftWord, ftAutoInc:
jf.I[fld.FieldName] := fld.AsInteger;
ftLargeint:
jf.I[fld.FieldName] := TLargeintField(fld).AsLargeInt;
ftCurrency:
jf.C[fld.FieldName] := fld.AsCurrency;
ftFloat, ftBCD:
jf.D[fld.FieldName] := fld.AsFloat;
ftTimeStamp, db.ftDate, ftTime, ftDateTime:
jf.D[fld.FieldName] := fld.AsDateTime;
ftString, ftFixedChar, ftMemo, ftWideString:
jf.S[fld.FieldName] := HttpEncode(fld.AsString);
ftBytes, ftVarBytes, DB.ftBlob, ftGraphic, ftOraBlob, ftOraClob:
begin
blob := TStringStream.Create('');
try
TBlobField(fld).SaveToStream(blob);
jf.S[fld.FieldName] := EncodeString(blob.DataString); // base64 encode
finally
blob.Free;
end;
end;
end;
end;
end;
ja.AsArray.Add(jf);
dataset.Next;
end;
jo.O['data'] := ja;
Result := jo.AsString;
end;

end.

SUPEROBJECT序列数据集为JSON的更多相关文章

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

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

  2. superobject 序列数据集

    unit uDBJson; interface {$HINTS OFF} uses SysUtils, Classes, Variants, DB, DBClient, SuperObject; ty ...

  3. 数据集转换为Json

    数据集转换为Json 第一步:新建一个类对象  通常我会写三个属性:状态.返回信息.数据集 第二步:新建一个JSON转换类 第三步:把类对象当做参数传入JSON转换类 ———————————————— ...

  4. mormot 数据集转换为JSON字串

    mormot 数据集转换为JSON字串 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graph ...

  5. .NET中JSON序列化(数据集转JSON)

    Json序列化和反序列化指的是:对象序列化为JSON,并可用于从 JSON 反序列化对象 在.net 3.5中已支持JSON,引用命名空间: using System.Web.Script.Seria ...

  6. 向Solr数据集提交Json格式数据(Scala,Post)

    import scalaj.http.Http class SolrAdd () {// 方法接受两个参数,dataType为数据集名称,jsonString为数据json字符串 def postTo ...

  7. 给COCO数据集的json标签换行

    #include <iostream> #include <fstream> #include <string> #include <vector> u ...

  8. Android为TV端助力之解析序列话的JSON

    解析json时报错default constructor not found. class............. 比如 public class MediaRepBean implements P ...

  9. c# dynamic实现动态实体,不用定义实体就能序列化为标准json

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

随机推荐

  1. 【树形dp】7.14城市

    很典型的按照边考虑贡献的题. 题目描述 小A居住的城市可以认为由n个街区组成.街区从1到n依次标号街区与街区之间由街道相连,每个街区都可以通过若干条街道到达任意一个街区,共有n-1条街道.其中标号为i ...

  2. springboot 修炼之路

    网上无意中发现一份关于springboot的教程说明,说的很详细,大家可以参考.具体地址:http://www.spring4all.com/article/246

  3. (62)zabbix客户端自动注册

    1. 概述 上一篇内容<zabbix自动发现配置>,大概内容是zabbix server去扫描一个网段,把在线的主机添加到Host列表中. 我们本篇内容与上篇相反,这次是Active ag ...

  4. usb3.0驱动

    usb3.0驱动下载地址 华硕注入usb3.0驱动工具下载地址 https://dlsvr04.asus.com/pub/ASUS/misc/utils/ASUS_EZInstaller_V10306 ...

  5. 暴力解说之首次部署NGINX

    前言 本章基于Centos 7.x系统讲解 本章讲解下在项目上线部署的时候对NGINX的操作.有些童鞋在网上百度类似LNMP安装就跟着命令一条一条执行了,如果没报错还好,一旦报错就懵逼状态了.这是对自 ...

  6. js 做的随机8位验证码

    开发思路: 画出放置验证码的模块.一个写有“看不清…”的小块,以及输入验证码的文本框 获取各个模块 封装一个函数Yan_ma(),设置验证码为8位,里面含有数字,小写字母,小写字母和中文.每种类型出现 ...

  7. Luogu3195 [HNOI2008]玩具装箱TOY (方程变形 + 斜率优化 )

    题意: 给出一个序列 {a[i]} 把其分成若干个区间,每个区间的价值为 W = (j − i + ∑ak(i<=k<=j) - L)​2 ,求所有分割方案中价值之和的最小值. 细节: 仔 ...

  8. IntelliJ IDEA 类和方法注释的生成以及Javadoc的简单使用记录

    idea,设置类注释和,方法注释的常见的设置方法(不同的版本设置方法有所偏差,简单记录一些目前自己在使用的方法,) 方法注释:在keyMap中搜索Fix doc comment ,后点击右键设置一个快 ...

  9. [转]pickle python数据存储

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...

  10. STM32F407 I2C 个人笔记

    源代码;https://github.com/YuQiao0303/STM32F407-Examples/tree/master/24.IIC 概述 I2C (IIC, Inter-Integrate ...