// 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. windows下pycharm使用Anaconda安装包环境

    转自: https://www.cnblogs.com/heitaoq/p/8632315.html

  2. History Api以及hash操作

    https://segmentfault.com/a/1190000002447556#articleHeader12 https://developer.mozilla.org/zh-CN/docs ...

  3. linux文件权限更改命令chmod及数字权限

    chmod -change file mode bits :更改文件权限 chmod是用来改变文件或者目录权限的命令,但只有文件的属主和超级用户(root)才有这种权限. 更改文件权限的2种方式: 一 ...

  4. Verilog学习笔记基本语法篇(六)········ 循环语句

    在Verilog中存在着4种类型的循环语句,用来控制执行语句的执行次数. 1)forever语句: 连续执行的语句. 2)repeat语句:  连续执行n次的语句. 3)while语句:    执行语 ...

  5. cs229_part5

    这部分主要补充一些cs229没涉及到,但是实际上非常重要,而且是实际中真正会用的一些算法,即集成学习. 集成学习 问题背景 既然我们已经知道了很多学习算法,这些算法最终会输出一个结果.能不能把这些结果 ...

  6. wei UI使用

    1.前言 通过前面系列文章的学习与讲解,相信大家已经对微信的开发有了一个全新的认识.后端基本能够基于盛派的第三方sdk搞定大部分事宜,剩下的就是前端了.关于手机端的浏览器的兼容性问题相信一直是开发者们 ...

  7. navigator.language介绍

    navigator.language返回一个字符串,该字符串代表用户的首先语言,通常是浏览器使用的语言.navigator.language为只读属性. 用法: var lang = globalOb ...

  8. map 插入数据的方式局别

    #include<map> #include<iostream> usingnamespace std; int main() { map <int, int> m ...

  9. mysql条件查询and or使用实例及优先级介绍

    mysql and与or介绍 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 使用OR关键字时: 只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来. 如果不符合这 ...

  10. Centos6.5搭建git远程仓库

    远程仓库搭建 step1:安装git ```yum -y install git``` step2:创建用户git,用来运行git服务 useradd git passwd git //修改git用户 ...