JUST SHARE - MySQL DataSet in Json Format using delphi SuperObject

Just share your experience using Json using Delphi SuperObject

The idea is how easy it is to convert the query result to json format.

I use a string to represent the entire data format (including BLOB, DATE, DATETIME). In the future, a json file can be easily imported into a database.

I am not writing code from scratch, I just made a small modification suitable for my own needs.

Here is the code:

  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;
+6
source share

Source: https://habr.com/ru/post/887893/


All Articles