[Lazarus] Convert record to JSON?

Michael Van Canneyt michael at freepascal.org
Fri Jul 20 19:41:59 CEST 2018



On Fri, 20 Jul 2018, Bo Berglund via Lazarus wrote:

> On Fri, 20 Jul 2018 20:09:25 +0300, AlexeyT via Lazarus
> <lazarus at lists.lazarus-ide.org> wrote:
>
>>
>>> The config data are stored in a record and consists of a mix of data
>>> types like strings and numbers as well as booleans.
>>> Is there a simple way to encode the record as a JSON message
>>
>> Yes, it is. You can write to json values by path: /dir1/dir2/dir3/key,
>>
>> so for your record, make string paths for your values: /myrec/keybool ; 
>> /myrec/keyint ; ...
>>
>
> I am not sure I understand your suggestion...
>
> I was thinking something like this (based on an example in the wiki
> (http://wiki.freepascal.org/Streaming_JSON):
>
> type TMyRecord = record
>    checksum: word;
>    ssid: AnsiString;
>    passwd: AnsiString;
>    macaddr: AnsiString;
>    addr: TIpAddress;
>    baud: integer;
>    tcpport: word;
>    mode: byte;
>    channel: byte;
>    hidden: byte;  // hidden (1) or visible (0)
>    fixedaddress: byte; //Station mode fixed addr instead of DHCP
>    numsensors: byte; //Number of active DHT sensors (0..3)
>    dhtinterval: word;  // Interval between DHT sensor readings (min)
>    host: AnsiString;
>    reserved: array[0..18] of byte;
>  end;
>
>
> function RecToJSON(RC: TMyrecord): string;
> var
>  JS: TJSONStreamer;
> begin
>  JS := TJSONStreamer.Create(NIL);
>  try
>    JS.Options := JS.Options + [jsoTStringsAsArray];
>    Result := JS.RecordToJSONString(RC);  //Seems not to exist...
>  finally
>    JS.Free;
>  end;
> end;
>
> So I have two issues here:
> 1) It seems like there is no RecordToJSONString method only
> ObjectToJSONString.
>
> 2) Do I have to convert my record to an object just to be able to use
> JSON with it?
>
> I want to avoid having to maintain a function where every member of
> the record will be individually handled by name, then I don't gain
> anything by going for JSON regarding future additions.
> I want the output of the RecToJSON function to contain the field names
> and current values of the record without ever changing this function
> in the future when new fields are added....
>
> Is this at all possible?

For classes it is possible, but not for records (yet). 
See the jsonrtti unit.

Michael.


More information about the Lazarus mailing list