日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Delphi中JSon SuperObject 使用:数据集与JSON对象互转

發(fā)布時間:2025/3/15 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi中JSon SuperObject 使用:数据集与JSON对象互转 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在delphi中,數(shù)據(jù)集是最常用數(shù)據(jù)存取方式。因此,必須建立JSON與TDataSet之間的互轉(zhuǎn)關(guān)系,實現(xiàn)數(shù)據(jù)之間通訊與轉(zhuǎn)換。值得注意的是,這只是普通的TDataset與JSON之間轉(zhuǎn)換,由于CDS包含了Delta數(shù)據(jù)包,其數(shù)據(jù)格式遠(yuǎn)比普通的TDataset更復(fù)雜。

數(shù)據(jù)集字段信息,是一個完整的字典信息。因此,我們在JSON必須也建立字典信息,才能創(chuàng)建數(shù)據(jù)集的字段信息。我們設(shè)置其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}]

數(shù)據(jù)信息以Data做節(jié)點(diǎn),也是一個數(shù)組嵌套記錄信息:

"Data":[記錄集信息]

廢話少說,直接上代碼:unit uDBJson;

?

interface

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 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;

implementation

uses TypInfo,encddecd;

?

{ TTableJSon }

?

class function TTableJSon.CDSFromJSon(CDS: TClientDataSet;

Json: ISuperObject): Boolean;

var

ColsJson:ISuperObject;

begin

Result := False;

if Json = nil then

??? Exit;

CDS.Close;

CDS.Data := Null;

//創(chuàng)建字段

ColsJson := Json.O[cstCols];

CreateFieldByJson(CDS.FieldDefs,ColsJson);

if CDS.FieldDefs.Count >0 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 function TTableJSon.ImportDataFromJSon(DataSet: TDataSet;

DataJson: ISuperObject): Integer;

var

SubJson:ISuperObject;

i:Integer;

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.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;

var

sj,aj,sj2:ISuperObject;

i:Integer;

Fieldtyp,JsonTyp:string;

List:TStringList;

begin

sj := SO();

//創(chuàng)建列

aj := SA([]);

List := TStringList.Create;

try

??? List.Sorted := True;

??

??? for i := 0 to DataSet.FieldCount - 1 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;

??? //創(chuàng)建數(shù)據(jù)集的數(shù)據(jù)

??? DataSet.DisableControls;

?

??? DataSet.First;

??? aj := SA([]);

??? while not DataSet.Eof do

??? begin

????? sj2 := SO();

????? for i := 0 to DataSet.FieldCount - 1 do

????? begin

??????? //sj2.S[IntToStr(DataSet.Fields[i].Index)] := VarToStrDef(DataSet.Fields[i].Value,'');

??????? 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.

?

調(diào)用示例:

?

//數(shù)據(jù)集轉(zhuǎn)JSON對象或JSON文本

?

var

json:TTableJSon;

s:string;

?

begin

?

S := json.JSonFromDataSet(ADODataSet1);

?

//在用TStringStream讀入字符串S,存成文本,看看其格式.

?

end;

?

//JSON對象或文本,裝載到數(shù)據(jù)集

?

var

json:ISuperObject;

begin

json := TSuperObject.ParseFile('json.txt',False);

TTableJSon.CDSFromJSon(cdsJSON,json);

end;
復(fù)制代碼
?

總結(jié)

以上是生活随笔為你收集整理的Delphi中JSon SuperObject 使用:数据集与JSON对象互转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。