Delphi SuperObject を使用して Json を使用した私の経験を共有してください
アイデアは、クエリ結果をjson形式に簡単に変換する方法です。
文字列を使用して、すべてのデータ形式 (BLOB、DATE、DATETIME を含む) を表します。将来的には、json ファイルをデータベースに簡単にインポートできます。
私はゼロからコードを書くのではなく、自分のニーズに合わせて少し変更を加えただけです
コードは次のとおりです。
関数 TTableJSon.CreateJsonValueByFieldMySql(Json: ISuperObject;
フィールド: TField): ブール値。
変数
JsonTyp、FieldTyp : 文字列;
tmpStr : 文字列;
始める
結果:=偽;
フィールドが TDateField の場合、開始
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)+'"')
フィールドが TMemoField の場合は終了し、開始します
Json.S[Field.FieldName] := EncodeString(Field.AsString)
フィールドが TBlobField の場合は終了し、開始します
Json.S[Field.FieldName] := EncodeString(Field.AsString)
フィールドが TFloatField の場合は終了し、開始する
Json.O[フィールド.フィールド名] := SO(ReplaceStr(フィールド.AsString,',','.'))
終了するか開始する
Json.O[フィールド.フィールド名] := SO(フィールド.値);
終わり;
結果:=真;
終わり;
関数 TTableJSon.JSonFromDataSet(DataSet: TDataSet): 文字列;
プロシージャ GetFieldTypeInfo(Field:TField;var Fieldtyp,JsonTyp:string);
始める
Fieldtyp := GetEnumName(TypeInfo(TFieldType),ord(Field.DataType));
削除 (Fieldtyp,1,2);
Field が TStringField の場合
JsonTyp := '文字列'
フィールドが TDateTimeField の場合
JsonTyp := '整数'
フィールドが TMemoField の場合
JsonTyp := 'メモ'
フィールドが TBlobField の場合
JsonTyp := 'ブロブ'
それ以外の場合 (フィールドが TIntegerField) または (フィールドが TLargeintField) の場合
JsonTyp := '整数'
フィールドが TCurrencyField の場合
JsonTyp := '通貨'
フィールドが TNumericField の場合
JsonTyp := 'ダブル'
それ以外の場合、Field が TBooleanField の場合
JsonTyp := 'ブール値'
そうしないと
JsonTyp := 'バリアント';
終わり;
変数
sj、aj、sj2:ISuperObject;
i:整数;
Fieldtyp、JsonTyp:文字列;
リスト:TStringList;
始める
sj := SO();
aj := SA([]);
リスト:= TStringList.Create;
試す
List.Sorted := True;
for i := 0 to DataSet.FieldCount - 1 do
始める
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);
終わり;
sj.O['Cols'] := aj;
DataSet.DisableControls;
DataSet.First;
aj := SA([]);
while not DataSet.Eof do
始める
sj2 := SO();
for i := 0 to DataSet.FieldCount - 1 do
始める
if VarIsNull(DataSet.Fields[i].Value) then
sj2.O[DataSet.Fields[i].FieldName] := SO(ヌル)
そうでなければ始める
CreateJsonValueByFieldMySql(sj2,DataSet.Fields[i]);
終わり;
終わり;
aj.AsArray.Add(sj2);
DataSet.Next;
終わり;
sj.O['データ'] := aj;
結果:= sj.AsString;
最後に
List.Free;
DataSet.EnableControls;
終わり;
終わり;