




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在delphi中,数据集是最常用数据存取方式。因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换。值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包含了Delta数据包,其数据格式远比普通的TDataset更复杂。 数据集字段信息,是一个完整的字典信息。因此,我们在JSON必须也建立字典信息,才能创建数据集的字段信息。我们设置其JSON信息如下: COLS:字段列表信息,如:Cols:JsonType:integer,FieldIndex:0,FieldType:Integer,FieldSize:0,FieldName:ID,Required:false,JsonType:string,FieldIndex:1,FieldType:String,FieldSize:100,FieldName:Title,Required:false,JsonType:variant,FieldIndex:2,FieldType:Blob,FieldSize:0,FieldName:Picture,Required:false数据信息以Data做节点,也是一个数组嵌套记录信息:Data:记录集信息废话少说,直接上代码:unit uDBJson;interfaceusesSysUtils,Classes,Variants,DB,DBClient,SuperObject;typeTTableJSon = classprivate 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 JSonFromDataSet(DataSet:TDataSet):string; class function CreateFieldByJson(Fields:TFieldDefs;ColsJson:ISuperObject):Boolean; class function ImportDataFromJSon(DataSet:TDataSet;DataJson:ISuperObject):Integer; class function CDSFromJSon(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;implementationuses TypInfo,encddecd; TTableJSon class function TTableJSon.CDSFromJSon(CDS: TClientDataSet;Json: ISuperObject): Boolean;varColsJson:ISuperObject; beginResult := False;if Json = nil then Exit;CDS.Close;CDS.Data := Null;/创建字段ColsJson := Json.OcstCols;CreateFieldByJson(CDS.FieldDefs,ColsJson);if CDS.FieldDefs.Count 0 then CDS.CreateDataSet;ImportDataFromJSon(CDS,Json.OcstData);Result := True;end;class function TTableJSon.CreateFieldByJson(Fields: TFieldDefs;ColsJson: ISuperObject): Boolean;varSubJson:ISuperObject;ft:TFieldType;beginResult := False;Fields.DataSet.Close;Fields.Clear;for SubJson in ColsJson dobegin ft := TFieldType(GetEnumValue(TypeInfo(TFieldType),ft+SubJson.ScstFieldType); if ft= ftAutoInc then /自增字段不能录入,必须更改 ft := ftInteger; Fields.Add(SubJson.ScstFieldName,ft,SubJson.IcstFieldSize,SubJson.BcstRequired);end;Result := True;end;class function TTableJSon.CreateJsonValue(Json: ISuperObject;const Name: string; const Value: Variant): Boolean;beginResult := False;Json.OName := SO(Value);Result := True;end;class function TTableJSon.CreateJsonValueByField(Json: ISuperObject;Field: TField): Boolean;beginResult := False;if Field Is TDateTimeField then Json.OField.FieldName := SO(Field.AsDateTime)else if Field is TBlobField then Json.SField.FieldName := EncodeString(Field.AsString)else Json.OField.FieldName := SO(Field.Value);Result := True;end;class function TTableJSon.GetValue(Json: ISuperObject;const Name: string): Variant;begincase Json.DataType of stNull: Result := Null; stBoolean: Result := Json.BName; stDouble: Result := Json.DName; stCurrency: Result := Json.CName; stInt: Result := Json.IName; stString: Result := Json.SName;end;end;class function TTableJSon.GetValue2Field(Field: TField; JsonValue:ISuperObject): Variant;beginif JsonValue.DataType = stNull then Result := Nullelse if Field is TDateTimeField then Result := JavaToDelphiDateTime(JsonValue.AsInteger)else if (Field is TIntegerField) or (Field is TLargeintField) then Result := JsonValue.AsIntegerelse if Field is TNumericField then Result := JsonValue.AsDoubleelse if Field is TBooleanField then Result := JsonValue.AsBooleanelse if Field is TStringField then Result := JsonValue.AsStringelse if Field is TBlobField then Result := DecodeString(JsonValue.AsString) end;class function TTableJSon.ImportDataFromJSon(DataSet: TDataSet;DataJson: ISuperObject): Integer;varSubJson:ISuperObject;i:Integer;iter: TSuperObjectIter;beginif 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.JSonFromDataSet(DataSet:TDataSet):string;procedure GetFieldTypeInfo(Field:TField;var Fieldtyp,JsonTyp:string);begin Fieldtyp := GetEnumName(TypeInfo(tfieldtype),ord(Field.DataType); Delete(Fieldtyp,1,2); 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;varsj,aj,sj2:ISuperObject;i:Integer;Fieldtyp,JsonTyp:string;List:TStringList;beginsj := SO();/创建列aj := SA();List := TStringList.Create;try List.Sorted := True; for i := 0 to DataSet.FieldCount - 1 do begin sj2 := SO(); GetFieldTypeInfo(DataSet.Fieldsi,Fieldtyp,JsonTyp); sj2.ScstFieldName := DataSet.Fieldsi.FieldName; sj2.ScstFieldType := Fieldtyp; sj2.ScstJsonType := JsonTyp; sj2.IcstFieldSize := DataSet.Fieldsi.Size; sj2.BcstRequired := DataSet.Fieldsi.Required; sj2.IcstFieldIndex := DataSet.Fieldsi.Index; aj.AsArray.Add(sj2); List.Add(DataSet.Fieldsi.FieldName+=+JsonTyp); end; sj.OCols := aj; /创建数据集的数据 DataSet.DisableControls; DataSet.First; aj := SA(); while not DataSet.Eof do begin sj2 := SO(); for i := 0 to DataSet.FieldCount - 1 do begin /sj2.SIntToStr(DataSet.Fieldsi.Index) := VarToStrDef(DataSet.Fieldsi.Value,); if VarIsNull(DataSet.Fieldsi.Value) then sj2.ODataSet.Fieldsi.FieldName := SO(Null) else begin CreateJsonValueByField(sj2,DataSet.Fieldsi); end; end; aj.AsArray.Add(sj2); DataSet.Next; end; sj.OData := aj; Result := sj.AsString;finally List.Free; DataSet.EnableControls;end;end;end.调用示例:/数据集转JSON对象或JSON文本varjson:TTableJSon;s:string;beginS := json.JSonFromDataSet(ADODataSet1);/在用TStringStream读入字符串S,存成文本,看看其格式.end;/JSON对象或文本,装载到数据集varjson:ISuperObject;beginjson := TSuperObject.ParseFile(json.txt,False);TTableJSon.CDSFromJSon(cdsJSON,json);end; JSON不能完全替代XML,但绝对是未来的大势所趋,其优点是简单、体积小、解析更快、解析占用资源更少。在delphi中,数据集是最常用数据存取方式。因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换。值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包含了Delta数据包,其数据格式远比普通的TDataset更复杂。下面的程序,或许你有不同的想法,如果你的想法更好更快,欢迎一起讨论。今天是2009年最后的几十分钟,重要的并不是写博客,而是想向大家说一声“新年好运,事业有成”! 数据集字段信息,是一个完整的字典信息。因此,我们在JSON必须也建立字典信息,才能创建数据集的字段信息。我们设置其JSON信息如下: COLS:字段列表信息,如:Cols:JsonType:integer,FieldIndex:0,FieldType:Integer,FieldSize:0,FieldName:ID,Required:false,JsonType:string,FieldIndex:1,FieldType:String,FieldSize:100,FieldName:Title,Required:false,JsonType:variant,FieldIndex:2,FieldType:Blob,FieldSize:0,FieldName:Picture,Required:false数据信息以Data做节点,也是一个数组嵌套记录信息:Data:记录集信息废话少说,直接上代码:unit uDBJson;interfaceusesSysUtils,Classes,Variants,DB,DBClient,SuperObject;typeTTableJSon = classprivate 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 JSonFromDataSet(DataSet:TDataSet):string; class function CreateFieldByJson(Fields:TFieldDefs;ColsJson:ISuperObject):Boolean; class function ImportDataFromJSon(DataSet:TDataSet;DataJson:ISuperObject):Integer; class function CDSFromJSon(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;implementationuses TypInfo,encddecd; TTableJSon class function TTableJSon.CDSFromJSon(CDS: TClientDataSet;Json: ISuperObject): Boolean;varColsJson:ISuperObject; beginResult := False;if Json = nil then Exit;CDS.Close;CDS.Data := Null;/创建字段ColsJson := Json.OcstCols;CreateFieldByJson(CDS.FieldDefs,ColsJson);if CDS.FieldDefs.Count 0 then CDS.CreateDataSet;ImportDataFromJSon(CDS,Json.OcstData);Result := True;end;class function TTableJSon.CreateFieldByJson(Fields: TFieldDefs;ColsJson: ISuperObject): Boolean;varSubJson:ISuperObject;ft:TFieldType;beginResult := False;Fields.DataSet.Close;Fields.Clear;for SubJson in ColsJson dobegin ft := TFieldType(GetEnumValue(TypeInfo(TFieldType),ft+SubJson.ScstFieldType); if ft= ftAutoInc then /自增字段不能录入,必须更改 ft := ftInteger; Fields.Add(SubJson.ScstFieldName,ft,SubJson.IcstFieldSize,SubJson.BcstRequired);end;Result := True;end;class function TTableJSon.CreateJsonValue(Json: ISuperObject;const Name: string; const Value: Variant): Boolean;beginResult := False;Json.OName := SO(Value);Result := True;end;class function TTableJSon.CreateJsonValueByField(Json: ISuperObject;Field: TField): Boolean;beginResult := False;if Field Is TDateTimeField then Json.OField.FieldName := SO(Field.AsDateTime)else if Field is TBlobField then Json.SField.FieldName := EncodeString(Field.AsString)else Json.OField.FieldName := SO(Field.Value);Result := True;end;class function TTableJSon.GetValue(Json: ISuperObject;const Name: string): Variant;begincase Json.DataType of stNull: Result := Null; stBoolean: Result := Json.BName; stDouble: Result := Json.DName; stCurrency: Result := Json.CName; stInt: Result := Json.IName; stString: Result := Json.SName;end;end;class function TTableJSon.GetValue2Field(Field: TField; JsonValue:ISuperObject): Variant;beginif JsonValue.DataType = stNull then Result := Nullelse if Field is TDateTimeField then Result := JavaToDelphiDateTime(JsonValue.AsInteger)else if (Field is TIntegerField) or (Field is TLargeintField) then Result := JsonValue.AsIntegerelse if Field is TNumericField then Result := JsonValue.AsDoubleelse if Field is TBooleanField then Result := JsonValue.AsBooleanelse if Field is TStringField then Result := JsonValue.AsStringelse if Field is TBlobField then Result := DecodeString(JsonValue.AsString) end;class function TTableJSon.ImportDataFromJSon(DataSet: TDataSet;DataJson: ISuperObject): Integer;varSubJson:ISuperObject;i:Integer;iter: TSuperObjectIter;beginif 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.JSonFromDataSet(DataSet:TDataSet):string;procedure GetFieldTypeInfo(Field:TField;var Fieldtyp,JsonTyp:string);begin Fieldtyp := GetEnumName(TypeInfo(tfieldtype),ord(Field.DataType); Delete(Fieldtyp,1,2); 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;varsj,aj,sj2:ISuperObject;i:Integer;Fieldtyp,JsonTyp:string;List:TStringList;beginsj := SO();/创建列aj := SA();List := TStringList.Create;try List.Sorted := True; for i := 0 to DataSet.FieldCount - 1 do begin sj2 := SO(); GetFieldTypeInfo(DataSet.Fieldsi,Fieldtyp,JsonTyp); sj2.ScstFieldName := DataSet.Fieldsi.FieldName; sj2.ScstFieldType := Fieldtyp; sj2.ScstJsonType := JsonTyp; sj2.IcstFieldSize := DataSet.Fieldsi.Size; sj2.BcstRequired := DataSet.Fieldsi.Required; sj2.IcstFieldIndex := DataSet.Fieldsi.Index; aj.AsArray.Add(sj2); List.Add(DataSet.Fieldsi.FieldName+=+JsonTyp); end; sj.OCols := aj; /创建数据集的数据 DataSet.DisableControls; DataSet.First; aj := SA(); while not DataSet.Eof do begin sj2 := SO(); for i := 0 to DataSet.FieldCount - 1 do begin /sj2.SIntToStr(DataSet.Fieldsi.Index) := VarToStrDef(DataSet.Fieldsi.Value,); if VarIsNull(DataSet.Fieldsi.Value) then sj2.ODataSet.Fieldsi.FieldName := SO(Null) else begin CreateJsonValueByField(sj2,DataSet.Fieldsi); end; end; aj.AsArray.Add(sj2); DataSet.Next; end; sj.OData := aj; Result := sj.AsString;finally List.Free; DataSet.EnableControls;end; end;end.调用示例:/数据集转JSON对象或JSON文本varjson:TTableJSon;s:string;beginS := json.JSonFromDataSet(ADODataSet1);/在用TStringStream读入字符串S,存成文本,看看其格式.end;/JSON对象或文本,装载到数据集varjson:ISuperObject;beginjson := TSuperObject.ParseFile(json.txt,False);TTableJSon.CDSFromJSon(cdsJSON,json);end; JSON不能完全替代XML,但绝对是未来的大势所趋,其优点是简单、体积小、解析更快、解析占用资源更少。在delphi中,数据集是最常用数据存取方式。因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换。值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包含了Delta数据包,其数据格式远比普通的TDataset更复杂。下面的程序,或许你有不同的想法,如果你的想法更好更快,欢迎一起讨论。今天是2009年最后的几十分钟,重要的并不是写博客,而是想向大家说一声“新年好运,事业有成”! 数据集字段信息,是一个完整的字典信息。因此,我们在JSON必须也建立字典信息,才能创建数据集的字段信息。我们设置其JSON信息如下: COLS:字段列表信息,如:Cols:JsonType:integer,FieldIndex:0,FieldType:Integer,FieldSize:0,FieldName:ID,Required:false,JsonType:string,FieldIndex:1,FieldType:String,FieldSize:100,FieldName:Title,Required:false,JsonType:variant,FieldIndex:2,FieldType:Blob,FieldSize:0,FieldName:Picture,Required:false数据信息以Data做节点,也是一个数组嵌套记录信息:Data:记录集信息废话少说,直接上代码:unit uDBJson;interfaceusesSysUtils,Classes,Variants,DB,DBClient,SuperObject;typeTTableJSon = classprivate 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 JSonFromDataSet(DataSet:TDataSet):string; class function CreateFieldByJson(Fields:TFieldDefs;ColsJson:ISuperObject):Boolean; class function ImportDataFromJSon(DataSet:TDataSet;DataJson:ISuperObject):Integer; class function CDSFromJSon(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;implementationuses TypInfo,encddecd; TTableJSon class function TTableJSon.CDSFromJSon(CDS: TClientDataSet;Json: ISuperObject): Boolean;varColsJson:ISuperObject; beginResult := False;if Json = nil then Exit;CDS.Close;CDS.Data := Null;/创建字段ColsJson := Json.OcstCols;CreateFieldByJson(CDS.FieldDefs,ColsJson);if CDS.FieldDefs.Count 0 then CDS.CreateDataSet;ImportDataFromJSon(CDS,Json.OcstData);Result := True;end;class function TTableJSon.CreateFieldByJson(Fields: TFieldDefs;ColsJson: ISuperObject): Boolean;varSubJson:ISuperObject;ft:TFieldType;beginResult := False;Fields.DataSet.Close;Fields.Clear;for SubJson in ColsJson dobegin ft := TFieldType(GetEnumValue(TypeInfo(TFieldType),ft+SubJson.ScstFieldType); if ft= ftAutoInc then /自增字段不能录入,必须更改 ft := ftInteger; Fields.Add(SubJson.ScstFieldName,ft,SubJson.IcstFieldSize,SubJson.BcstR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中考心理考试题及答案
- 2025年中医结业考试试题及答案
- 国家能源烟台市2025秋招计算机与自动化类面试追问及参考回答
- 国家能源恩施自治州2025秋招写作案例分析万能模板可套用
- 亳州市中石油2025秋招笔试模拟题含答案安全环保与HSE岗
- 武汉市中石化2025秋招面试半结构化模拟题及答案财务与审计岗
- 中国广电黄冈市2025秋招笔试行测题库及答案供应链采购类
- 安阳市中储粮2025秋招面试专业追问题库基建工程岗
- 孝感市中石油2025秋招网申填写模板含开放题范文
- 国家能源贺州市2025秋招面试专业追问及参考机械工程岗位
- 康复养老护理辅具研发
- 2024(苏教版)劳动六年级上册全册教学案
- 2025秋苏教版(2024)小学科学二年级上册(全册)教学设计(附目录P123)
- 2025年amOLED行业研究报告及未来行业发展趋势预测
- 2025年国家电网公司招聘面试模拟题集与答案解析
- 拍照摄影技巧
- 校园招聘服务协议书范本
- 语音厅运营基础知识培训
- 广州市房屋租赁合同国土局标准模版
- 停车场保安安全知识培训课件
- 校长在食堂从业人员培训会上的讲话
评论
0/150
提交评论