SUPEROBJECT序列数据集为JSON
// 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的更多相关文章
- Delphi中JSon SuperObject 使用:数据集与JSON对象互转
在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包 ...
- superobject 序列数据集
unit uDBJson; interface {$HINTS OFF} uses SysUtils, Classes, Variants, DB, DBClient, SuperObject; ty ...
- 数据集转换为Json
数据集转换为Json 第一步:新建一个类对象 通常我会写三个属性:状态.返回信息.数据集 第二步:新建一个JSON转换类 第三步:把类对象当做参数传入JSON转换类 ———————————————— ...
- mormot 数据集转换为JSON字串
mormot 数据集转换为JSON字串 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graph ...
- .NET中JSON序列化(数据集转JSON)
Json序列化和反序列化指的是:对象序列化为JSON,并可用于从 JSON 反序列化对象 在.net 3.5中已支持JSON,引用命名空间: using System.Web.Script.Seria ...
- 向Solr数据集提交Json格式数据(Scala,Post)
import scalaj.http.Http class SolrAdd () {// 方法接受两个参数,dataType为数据集名称,jsonString为数据json字符串 def postTo ...
- 给COCO数据集的json标签换行
#include <iostream> #include <fstream> #include <string> #include <vector> u ...
- Android为TV端助力之解析序列话的JSON
解析json时报错default constructor not found. class............. 比如 public class MediaRepBean implements P ...
- c# dynamic实现动态实体,不用定义实体就能序列化为标准json
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
随机推荐
- React项目搭建及依赖安装
一.前提 首先保证node.js已安装完成... 安装完成后,打开cmd命令行,输入 node -v 和 npm -v 来查看版本号,如果显示则安装完成. 二.安装react脚手架 在cmd命令行中输 ...
- CentOS7服务器上部署Oracle客户端
环境 操作系统: CentOS7.2.1511 x86_64 准备安装包 在这个网站:https://www.oracle.com/technetwork/topics/linuxx86-64soft ...
- 朋友去面试Python工程师,又带回来几道基础题,Python面试题No10
第1题: print 调用 Python 中底层的什么方法? print print() 用 sys.stdout.write() 实现 import sys print('hello') sys.s ...
- Python9- 生成器函数进阶-day14
生成器进阶#send的获取下一个值的效果和next基本一致,#只不过在获取下一个值的时候,给上一个值的位置穿第一个数据 使用send的注册事项: #第一次使用生成器的时候,必须用next获取下一个值 ...
- vmware 装 puppy
说做就做了,但是开始怎么试都没装成功,后来在网上查了些资料,再结合自己的实践,终于成功了.下面我就把如何让Puppy Linux安装到VMware 硬盘上一步一步奉献给大家. 一.准备 1.1 安装好 ...
- myeclipse 改变模版
一.修改Servlet的默认模板代码 使用MyEclipse创建Servlet时,根据默认的Servlet模板生成的Servlet代码如下: 1 package gacl.servlet.study; ...
- [转]pickle python数据存储
python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...
- Leetcode 329.矩阵中的最长递增路径
矩阵中的最长递增路径 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕). 示例 1: 输入: n ...
- [uiautomator篇] python uiautomatorDemo
#coding=utf-8 """ @version: 1.0 @author: @prerequisite: based on Python 2.7 @usage: 1 ...
- HDU-3743 Minimum Sum,划分树模板
Minimum Sum 被这个题坑了一下午,原来只需找一个最中间的数即可,我以为是平均数. 题意:找一个数使得这个数和区间内所有数的差的绝对值最小.输出最小值. 开始用线段树来了一发果断T了,然后各种 ...