Recent

Author Topic: Convert table to JSON array  (Read 668 times)

LemonParty

  • Sr. Member
  • ****
  • Posts: 391
Convert table to JSON array
« on: November 08, 2025, 06:55:55 pm »
Hello.

Is there a procedure that allow to convert a whole SQL table into JSON array?
Lazarus v. 4.99. FPC v. 3.3.1. Windows 11

bytebites

  • Hero Member
  • *****
  • Posts: 765
Re: Convert table to JSON array
« Reply #1 on: November 08, 2025, 10:08:48 pm »

paweld

  • Hero Member
  • *****
  • Posts: 1521
Re: Convert table to JSON array
« Reply #2 on: November 09, 2025, 06:58:32 am »
Something like this:
Code: Pascal  [Select][+][-]
  1. uses
  2.   fpjson, DateUtils, base64;
  3.  
  4. function TForm1.DataSetToJson(ds: TDataSet; FormatJson: Boolean): String;
  5. const
  6.   boolarr: array[Boolean] of String = ('false', 'true');
  7. var
  8.   jarr: TJsonArray;
  9.   jobj: TJsonObject;
  10.   i, idx: Integer;
  11.   stream: TStream;
  12.   s: String;
  13. begin
  14.   Result := '[]';
  15.   if not ds.Active or (ds.RecordCount = 0) then
  16.     exit;
  17.   jarr := TJsonArray.Create;
  18.   idx := ds.RecNo;
  19.   ds.DisableControls;
  20.   ds.First;
  21.   while not ds.EOF do
  22.   begin
  23.     jobj := TJsonObject.Create;
  24.     for i := 0 to ds.FieldCount - 1 do
  25.     begin
  26.       if ds.Fields[i].IsNull then
  27.         jobj.Nulls[ds.Fields[i].FieldName] := True
  28.       else
  29.       begin
  30.         case ds.Fields[i].DataType of
  31.           ftString, ftFixedChar, ftMemo: jobj.Add(ds.Fields[i].FieldName, ds.Fields[i].AsString);
  32.           ftSmallint, ftInteger, ftWord, ftLargeint, ftAutoInc: jobj.Add(ds.Fields[i].FieldName, ds.Fields[i].AsLargeInt);
  33.           ftFloat, ftCurrency{$IF FPC_FULLVERSION>30202}, ftSingle{$ENDIF}: jobj.Add(ds.Fields[i].FieldName, ds.Fields[i].AsFloat);
  34.           ftBoolean: jobj.Add(ds.Fields[i].FieldName, boolarr[ds.Fields[i].AsBoolean]);  
  35.           ftDateTime: jobj.Add(ds.Fields[i].FieldName, DateToISO8601(ds.Fields[i].AsDateTime));
  36.           ftDate: jobj.Add(ds.Fields[i].FieldName, FormatDatetime('yyyy-mm-dd', ds.Fields[i].AsDateTime));
  37.           ftTime: jobj.Add(ds.Fields[i].FieldName, FormatDatetime('hh:nn:ss', ds.Fields[i].AsDateTime));
  38.           ftBlob:
  39.             begin
  40.               stream := ds.CreateBlobStream(ds.Fields[i], bmRead);
  41.               s := '';
  42.               if stream.Size > 0 then
  43.               begin
  44.                 SetLength(s, stream.Size);
  45.                 stream.Position := 0;
  46.                 stream.Read(s[1], stream.Size);
  47.                 s := EncodeStringBase64(s);
  48.               end;
  49.               stream.Free;
  50.               jobj.Add(ds.Fields[i].FieldName, s);
  51.             end;
  52.         end;
  53.       end;
  54.     end;
  55.     jarr.Add(jobj);
  56.     ds.Next;
  57.   end;
  58.   ds.RecNo := idx;
  59.   ds.EnableControls;
  60.   if FormatJson then
  61.     Result := jarr.FormatJSON([], 2)
  62.   else
  63.     Result := jarr.AsJSON;
  64.   jarr.Free;
  65. end;
and then you use it like this, for example:
Code: Pascal  [Select][+][-]
  1. ShowMessage(DataSetToJson(TSQLQuery1, True);

Edit: Compliance with FPC 3.2.2
« Last Edit: November 09, 2025, 09:04:08 am by paweld »
Best regards / Pozdrawiam
paweld

dsiders

  • Hero Member
  • *****
  • Posts: 1495
Re: Convert table to JSON array
« Reply #3 on: November 09, 2025, 07:58:30 am »
Something like this:

There is no TFieldType called ftSingle in FPC 3.2.2.
Preview the next Lazarus documentation release at: https://dsiders.gitlab.io/lazdocsnext

paweld

  • Hero Member
  • *****
  • Posts: 1521
Re: Convert table to JSON array
« Reply #4 on: November 09, 2025, 08:43:51 am »
@dsiders Indeed. I am using 3.2-fixes.
According to the footer, OP using FPC 3.3.1, so will be OK too.
I edited my previous post
« Last Edit: November 09, 2025, 09:04:36 am by paweld »
Best regards / Pozdrawiam
paweld

LemonParty

  • Sr. Member
  • ****
  • Posts: 391
Re: Convert table to JSON array
« Reply #5 on: November 09, 2025, 01:55:19 pm »
Yes, paweld. This is what I need. Thank you.
Lazarus v. 4.99. FPC v. 3.3.1. Windows 11

dsiders

  • Hero Member
  • *****
  • Posts: 1495
Re: Convert table to JSON array
« Reply #6 on: November 09, 2025, 05:25:26 pm »
@dsiders Indeed. I am using 3.2-fixes.
According to the footer, OP using FPC 3.3.1, so will be OK too.
I edited my previous post

Sorry, I didn't notice the footer.
Preview the next Lazarus documentation release at: https://dsiders.gitlab.io/lazdocsnext

paweld

  • Hero Member
  • *****
  • Posts: 1521
Re: Convert table to JSON array
« Reply #7 on: November 09, 2025, 05:56:56 pm »
No problem. I think you're right, because most people use the stable version, so it would be good if the code didn't cause any errors in it.
Best regards / Pozdrawiam
paweld

 

TinyPortal © 2005-2018