// 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. sqlite查看所有表名、判断表是否存在,字段名及字段信息

    sqlite查看所有表名.判断表是否存在,字段名及字段信息   sqlite查看所有表名及字段名查询table,type 段是'table',name段是table的名字, select name f ...

  2. [LUOGU] P1063 能量项链

    题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...

  3. LeetCode(108) Convert Sorted Array to Binary Search Tree

    题目 Given an array where elements are sorted in ascending order, convert it to a height balanced BST. ...

  4. Exchange 邮件服务器内存硬盘估算

  5. Python第三方库之openpyxl(7)

    Python第三方库之openpyxl(7) 散点图 散点或xy图表类似于一些折线图.主要的区别在于,一个系列的值被绘制在另一个值上.当值未排序时,这是有用的. from openpyxl impor ...

  6. [LoadRunner]LR性能测试结果样例分析

    R性能测试结果样例分析 测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源. ...

  7. BNU OJ 1027 金币系统

    金币系统 Time Limit: 1000ms Memory Limit: 65535KB   64-bit integer IO format: %lld      Java class name: ...

  8. Leetcode 337.大家结舍III

    打家劫舍III 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根".除了"根"之外,每栋房子有且只有 ...

  9. pytorch遇到的问题:RuntimeError: randperm is only implemented for CPU

    由此,我们找到sample.py,第51行如下图修改

  10. HDU-3743 Minimum Sum,划分树模板

    Minimum Sum 被这个题坑了一下午,原来只需找一个最中间的数即可,我以为是平均数. 题意:找一个数使得这个数和区间内所有数的差的绝对值最小.输出最小值. 开始用线段树来了一发果断T了,然后各种 ...