使用Json using Delphi SuperObject
分享我的经验这个想法是如何轻松地将我的查询结果转换为json格式。
我使用字符串来表示所有数据格式(包括BLOB,DATE,DATETIME)。将来,json文件可以轻松导入数据库。
我不是从头开始编写代码,我只是根据自己的需要进行了一些修改
以下是代码:
function TTableJSon.CreateJsonValueByFieldMySql(Json: ISuperObject; Field: TField): Boolean; var JsonTyp, FieldTyp : string; tmpStr : string; begin Result := False; if Field Is TDateField then begin Json.O[Field.FieldName] := SO('"'+FormatDateTime('yyyy-mm-dd',Field.AsDateTime)+'"') end else if Field Is TDateTimeField then begin Json.O[Field.FieldName] := SO('"'+FormatDateTime('yyyy-mm-dd hh:nn:ss',Field.AsDateTime)+'"') end else if Field is TMemoField then begin Json.S[Field.FieldName] := EncodeString(Field.AsString) end else if Field is TBlobField then begin Json.S[Field.FieldName] := EncodeString(Field.AsString) end else if Field is TFloatField then begin Json.O[Field.FieldName] := SO(ReplaceStr(Field.AsString,',','.')) end else begin Json.O[Field.FieldName] := SO(Field.Value); end; Result := True; end; 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 TMemoField then JsonTyp := 'memo' else if Field is TBlobField then JsonTyp := 'blob' 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 := 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; DataSet.DisableControls; DataSet.First; aj := SA([]); while not DataSet.Eof do begin sj2 := SO(); for i := 0 to DataSet.FieldCount - 1 do begin if VarIsNull(DataSet.Fields[i].Value) then sj2.O[DataSet.Fields[i].FieldName] := SO(Null) else begin CreateJsonValueByFieldMySql(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;