superobject 序列数据集
 unit uDBJson;
 interface
 {$HINTS OFF}
 uses
   SysUtils, Classes, Variants, DB, DBClient, SuperObject;
 type
   TTableJSon = class
   private const
     cstFieldType = 'FieldType';
   const
     cstFieldName = 'FieldName';
   const
     cstFieldSize = 'FieldSize';
   const
     cstJsonType = 'JsonType';
   const
     cstRequired = 'Required';
   const
     cstFieldIndex = 'FieldIndex';
   const
     cstCols = 'Cols';
   const
     cstData = 'Data';
   public
     class function DataSetToJson(DataSet: TDataSet): ISuperObject;
     class function DataSetToJson2(DataSet: TDataSet): string;
     class function CreateFieldByJson(Fields: TFieldDefs;
       ColsJson: ISuperObject): Boolean;
     class procedure ImportDataFromJSon(DataSet: TDataSet;
       DataJson: ISuperObject);
     class function JSonToClientDataset(CDS: TClientDataSet; Json: ISuperObject)
       : Boolean;
     class function GetValue(Json: ISuperObject; const Name: string): Variant;
     class function CreateJsonValue(Json: ISuperObject; const Name: string;
       const Value: Variant): Boolean;
     class function CreateJsonValueByField(Json: ISuperObject;
       Field: TField): Boolean;
     class function GetValue2Field(Field: TField;
       JsonValue: ISuperObject): Variant;
   end;
 implementation
 uses TypInfo, encddecd;
 { TTableJSon }
 class function TTableJSon.JSonToClientDataset(CDS: TClientDataSet;
   Json: ISuperObject): Boolean;
 var
   ColsJson: ISuperObject;
 begin
   Result := False;
   if Json = nil then
     Exit;
   CDS.Close;
   CDS.Data := Null;
   // 创建字段
   ColsJson := Json.O[cstCols];
   CreateFieldByJson(CDS.FieldDefs, ColsJson);
   if CDS.FieldDefs.Count >  then
     CDS.CreateDataSet;
   ImportDataFromJSon(CDS, Json.O[cstData]);
   Result := True;
 end;
 class function TTableJSon.CreateFieldByJson(Fields: TFieldDefs;
   ColsJson: ISuperObject): Boolean;
 var
   SubJson: ISuperObject;
   ft: TFieldType;
 begin
   Result := False;
   Fields.DataSet.Close;
   Fields.Clear;
   for SubJson in ColsJson do
   begin
     ft := TFieldType(GetEnumValue(TypeInfo(TFieldType),
       'ft' + SubJson.S[cstFieldType]));
     if ft = ftAutoInc then // 自增字段不能录入,必须更改
       ft := ftInteger;
     Fields.Add(SubJson.S[cstFieldName], ft, SubJson.I[cstFieldSize],
       SubJson.B[cstRequired]);
   end;
   Result := True;
 end;
 class function TTableJSon.CreateJsonValue(Json: ISuperObject;
   const Name: string; const Value: Variant): Boolean;
 begin
   Result := False;
   Json.O[Name] := SO(Value);
   Result := True;
 end;
 class function TTableJSon.CreateJsonValueByField(Json: ISuperObject;
   Field: TField): Boolean;
 begin
   Result := False;
   if Field Is TDateTimeField then
     Json.O[Field.FieldName] := SO(Field.AsDateTime)
   else if Field is TBlobField then
     Json.S[Field.FieldName] := EncodeString(Field.AsString)
   else
     Json.O[Field.FieldName] := SO(Field.Value);
   Result := True;
 end;
 class function TTableJSon.GetValue(Json: ISuperObject;
   const Name: string): Variant;
 begin
   case Json.DataType of
     stNull:
       Result := Null;
     stBoolean:
       Result := Json.B[Name];
     stDouble:
       Result := Json.D[Name];
     stCurrency:
       Result := Json.C[Name];
     stInt:
       Result := Json.I[Name];
     stString:
       Result := Json.S[Name];
   end;
 end;
 class function TTableJSon.GetValue2Field(Field: TField;
   JsonValue: ISuperObject): Variant;
 begin
   if JsonValue.DataType = stNull then
     Result := Null
   else if Field is TDateTimeField then
     Result := JavaToDelphiDateTime(JsonValue.AsInteger)
   else if (Field is TIntegerField) or (Field is TLargeintField) then
     Result := JsonValue.AsInteger
   else if Field is TNumericField then
     Result := JsonValue.AsDouble
   else if Field is TBooleanField then
     Result := JsonValue.AsBoolean
   else if Field is TStringField then
     Result := JsonValue.AsString
   else if Field is TBlobField then
     Result := DecodeString(JsonValue.AsString)
 end;
 class procedure TTableJSon.ImportDataFromJSon(DataSet: TDataSet;
   DataJson: ISuperObject);
 var
   SubJson: ISuperObject;
   iter: TSuperObjectIter;
 begin
   if not DataSet.Active then
     DataSet.Open;
   DataSet.DisableControls;
   try
     for SubJson in DataJson do
     begin
       DataSet.Append;
       if ObjectFindFirst(SubJson, iter) then
       begin
         repeat
           if DataSet.FindField(iter.Ite.Current.Name) <> nil then
             DataSet.FindField(iter.Ite.Current.Name).Value :=
               GetValue2Field(DataSet.FindField(iter.Ite.Current.Name),
               iter.Ite.Current.Value);
         until not ObjectFindNext(iter);
       end;
       DataSet.Post;
     end;
   finally
     DataSet.EnableControls;
   end;
 end;
 class function TTableJSon.DataSetToJson(DataSet: TDataSet): ISuperObject;
   procedure GetFieldTypeInfo(Field: TField; var Fieldtyp, JsonTyp: string);
   begin
     Fieldtyp := GetEnumName(TypeInfo(TFieldType), ord(Field.DataType));
     Delete(Fieldtyp, , );
     if Field is TStringField then
       JsonTyp := 'string'
     else if Field is TDateTimeField then
       JsonTyp := 'integer'
     else if (Field is TIntegerField) or (Field is TLargeintField) then
       JsonTyp := 'integer'
     else if Field is TCurrencyField then
       JsonTyp := 'currency'
     else if Field is TNumericField then
       JsonTyp := 'double'
     else if Field is TBooleanField then
       JsonTyp := 'boolean'
     else
       JsonTyp := 'variant';
   end;
 var
   sj, aj, sj2: ISuperObject;
   I: Integer;
   Fieldtyp, JsonTyp: string;
   List: TStringList;
 begin
   sj := SO();
   // 创建列
   aj := SA([]);
   List := TStringList.Create;
   try
     List.Sorted := True;
     for I :=  to DataSet.FieldCount -  do
     begin
       sj2 := SO();
       GetFieldTypeInfo(DataSet.Fields[I], Fieldtyp, JsonTyp);
       sj2.S[cstFieldName] := DataSet.Fields[I].FieldName;
       sj2.S[cstFieldType] := Fieldtyp;
       sj2.S[cstJsonType] := JsonTyp;
       sj2.I[cstFieldSize] := DataSet.Fields[I].Size;
       sj2.B[cstRequired] := DataSet.Fields[I].Required;
       sj2.I[cstFieldIndex] := DataSet.Fields[I].Index;
       aj.AsArray.Add(sj2);
       List.Add(DataSet.Fields[I].FieldName + '=' + JsonTyp);
     end;
     sj.O['Cols'] := aj;
     // 创建数据集的数据
     DataSet.DisableControls;
     DataSet.First;
     aj := SA([]);
     while not DataSet.Eof do
     begin
       sj2 := SO();
       for I :=  to DataSet.FieldCount -  do
       begin
         if VarIsNull(DataSet.Fields[I].Value) then
           sj2.O[DataSet.Fields[I].FieldName] := SO(Null)
         else
         begin
           CreateJsonValueByField(sj2, DataSet.Fields[I]);
         end;
       end;
       aj.AsArray.Add(sj2);
       DataSet.Next;
     end;
     sj.O['Data'] := aj;
     Result := sj;
   finally
     List.Free;
     DataSet.EnableControls;
   end;
 end;
 class function TTableJSon.DataSetToJson2(DataSet: TDataSet): string;
   procedure GetFieldTypeInfo(Field: TField; var Fieldtyp, JsonTyp: string);
   begin
     Fieldtyp := GetEnumName(TypeInfo(TFieldType), ord(Field.DataType));
     Delete(Fieldtyp, , );
     if Field is TStringField then
       JsonTyp := 'string'
     else if Field is TDateTimeField then
       JsonTyp := 'integer'
     else if (Field is TIntegerField) or (Field is TLargeintField) then
       JsonTyp := 'integer'
     else if Field is TCurrencyField then
       JsonTyp := 'currency'
     else if Field is TNumericField then
       JsonTyp := 'double'
     else if Field is TBooleanField then
       JsonTyp := 'boolean'
     else
       JsonTyp := 'variant';
   end;
 var
   sj, aj, sj2: ISuperObject;
   I: Integer;
   Fieldtyp, JsonTyp: string;
   List: TStringList;
 begin
   sj := SO();
   // 创建列
   aj := SA([]);
   List := TStringList.Create;
   try
     List.Sorted := True;
     for I :=  to DataSet.FieldCount -  do
     begin
       sj2 := SO();
       GetFieldTypeInfo(DataSet.Fields[I], Fieldtyp, JsonTyp);
       sj2.S[cstFieldName] := DataSet.Fields[I].FieldName;
       sj2.S[cstFieldType] := Fieldtyp;
       sj2.S[cstJsonType] := JsonTyp;
       sj2.I[cstFieldSize] := DataSet.Fields[I].Size;
       sj2.B[cstRequired] := DataSet.Fields[I].Required;
       sj2.I[cstFieldIndex] := DataSet.Fields[I].Index;
       aj.AsArray.Add(sj2);
       List.Add(DataSet.Fields[I].FieldName + '=' + JsonTyp);
     end;
     sj.O['Cols'] := aj;
     // 创建数据集的数据
     DataSet.DisableControls;
     DataSet.First;
     aj := SA([]);
     while not DataSet.Eof do
     begin
       sj2 := SO();
       for I :=  to DataSet.FieldCount -  do
       begin
         if VarIsNull(DataSet.Fields[I].Value) then
           sj2.O[DataSet.Fields[I].FieldName] := SO(Null)
         else
         begin
           CreateJsonValueByField(sj2, DataSet.Fields[I]);
         end;
       end;
       aj.AsArray.Add(sj2);
       DataSet.Next;
     end;
     sj.O['Data'] := aj;
     Result := sj.AsString;
   finally
     List.Free;
     DataSet.EnableControls;
   end;
 end;
 end.
superobject 序列数据集的更多相关文章
- SUPEROBJECT序列数据集为JSON
		
// SUPEROBJECT 序列数据集 cxg 2017-1-12// {"data":[{"c1":1,"c2":1}]};// DEL ...
 - Delphi中JSon SuperObject 使用:数据集与JSON对象互转
		
在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包 ...
 - 解决DATASNAP远程方法参数超过32个的问题
		
群里有位同仁提出他有一个DATASNAP远程方法超过了32个参数,然后DELPHI编译通不过,提示方法参数不能超过32个,问怎么办?于是群内同仁纷纷出主意,我说用OLEVARINAT数组,有人说用RE ...
 - PrefixSpan算法原理总结
		
前面我们讲到频繁项集挖掘的关联算法Apriori和FP Tree.这两个算法都是挖掘频繁项集的.而今天我们要介绍的PrefixSpan算法也是关联算法,但是它是挖掘频繁序列模式的,因此要解决的问题目标 ...
 - 【SPMF开源数据挖掘平台入门】MaxSP算法使用说明
		
前段时间,由于项目中用到了序列挖掘的算法,师兄推荐我用用SPMF.在此做个记录. 首先简单介绍一下SPMF: SPMF是一个采用Java开发的开源数据挖掘平台. 它提供了51种数据挖掘算法实现,用于: ...
 - word2vec学习总结
		
目录 1.简介 2.从统计语言模型开始 2.1序列概率模型 2.2 N元统计模型 3.深度序列模型 3.1神经概率模型 3.2 one-hot向量表示法 3.3 word2vec 3.4word2ve ...
 - [转]综述论文翻译:A Review on Deep Learning Techniques Applied to Semantic Segmentation
		
近期主要在学习语义分割相关方法,计划将arXiv上的这篇综述好好翻译下,目前已完成了一部分,但仅仅是尊重原文的直译,后续将继续完成剩余的部分,并对文中提及的多个方法给出自己的理解. _论文地址:htt ...
 - 综述论文翻译:A Review on Deep Learning Techniques Applied to Semantic Segmentation
		
近期主要在学习语义分割相关方法,计划将arXiv上的这篇综述好好翻译下,目前已完成了一部分,但仅仅是尊重原文的直译,后续将继续完成剩余的部分,并对文中提及的多个方法给出自己的理解. 论文地址:http ...
 - 三维视觉、SLAM方向全球顶尖实验室汇总
		
本文作者 任旭倩,公众号:计算机视觉life,编辑成员 欧洲 英国伦敦大学帝国理工学院 Dyson 机器人实验室 http://www.imperial.ac.uk/dyson-robotics-la ...
 
随机推荐
- JS的join方法
			
join() 方法用于把数组中的所有元素放入一个字符串. 元素是通过指定的分隔符进行分隔的. 例子 1 在本例中,我们将创建一个数组,然后把它的所有元素放入一个字符串: <script type ...
 - springmvc实现简单的拦截器
			
SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方 ...
 - Spring 自定义配置类bean
			
<!-- 引入配置文件 --> <bean id="propertyConfigurer" class="org.springframework.bea ...
 - appium-desktop使用
			
Appium移动测试中有个很重新的组件Appium-Server,它主要用来监听我们的移动设备(真机或模拟器),然后将不同编程语言编写的 appium 测试脚本进行解析,然后,驱动移动设备来运行测试. ...
 - Mapper not initialized. Call Initialize with appropriate configuration.
			
System.InvalidOperationException:“Mapper not initialized. Call Initialize with appropriate configura ...
 - 修改ASPCMS升级扩展功能
			
修改 inc/aspcms_templateFun.asp 查找"content=decodeHtml(rsObj("Content"))" 替换为”conte ...
 - Linux系统目录结构,Shell脚本;关闭和开启防火墙
			
Linux系统目录结构 目录 描述 备注 /bin a.存放着最经常使用的命令 b.可执行文件,用户命令 c.构建最小系统所需要的命令 /boot a.内核与启动文件 b.系统启动相关文件 c.启动L ...
 - C#秘密武器之异步编程
			
一.概述 1.什么是异步? 异步操作通常用于执行完成时间可能较长的任务,如打开大文件.连接远程计算机或查询数据库.异步操作在主应用程序线程以外的线程中执行.应用程序调用方法异步执行某个操作时,应用程序 ...
 - C# 5 in a Nutshell - Delegate
			
1. What is delegate in C#? A delegate is an object that knows how to call a method.A delegate type d ...
 - java泛型介绍
			
一.泛型初衷 Java集合不会知道我们需要用它来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要就具有很好的通用性.但这样做也带来两个问题: –集合对元素类型没有任何限制,这样可能引 ...