6

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;
  終わり;

終わり;
4

0 に答える 0