Results 1 to 4 of 4

Thread: JsonToObject met array

  1. #1
    Senior Member Delphiwizard's Avatar
    Join Date
    Dec 2006
    Location
    België
    Posts
    160

    JsonToObject met array

    Hoi,

    Ik gebruik TJson.JsonToObject en dat werkt prima, maar ik weet niet hoe ik het moet toekennen als mijn Json een array is en ik die dus moet toekennen aan een array object.

    Bvb
    Delphi Code:
    1. TokenResult := TTokenResult.Create;
    2.          Try
    3.            TokenResult := TJson.JsonToObject<TTokenResult>(TokenRestResponse.Content);
    4.          finally
    5.            TokenResult.Free;
    6.          end;

    Dit werkt prima als TTokenResult bvb een class is met een string property.

    Maar als mijn json string een array is dan wil ik die via TJson.JsonToObject toekennen aan een class waarin een property is van type array van de class met de properties maar dit lukt niet.
    Heeft iemand een voorbeeld van hoe je TJson.JsonToObject gebruikt met een array?
    Last edited by Delphiwizard; 27-Dec-22 at 07:24.

  2. #2
    De JSon unit in mijn Delphi heeft geen TJson class. Welke parser gebruik je?

    In mijn geval zou het `TJSONObject.ParseJSONValue` moeten zijn. Dat levert dan een TJsonValue op, die een array of een object voor kan stellen.

    Parser terzijde, een geldige Json bevat één waarde op het hoogste niveau. Een waarde kan simpel zijn: een nummer, string, boolean of null; of het kan een complexe waarde zijn, namelijk een array van waarden of een object met properties die elk een waarde hebben.

    Simpele Json parsers bieden vaak losse classes of structs aan die die waarden voorstellen (je hebt dan bijvoorbeeld een TJsonBoolean object of record), maar veel libraries bieden ook de mogelijkheid aan om hun structuur te mappen op bestaande classes en de waarden daar automatisch aan toe te kennen.

    Om dat automatisch te laten werken, moet er wel enige overlap in zitten. Een 'losse' array mappen naar een object met een array property is tamelijk lastig omdat de structuur niet overeenkomt. Hoe moet die library tenslotte weten dat je die property bedoelt? De structuur is heel anders.

    Wellicht kan je specifieke mapper configuratie inregelen, maar waarschijnlijk is het het handigst om de library de boel te laten mappen naar een array, waarna je deze array zelf toekent aan de property.
    1+1=b

  3. #3
    Senior Member Delphiwizard's Avatar
    Join Date
    Dec 2006
    Location
    België
    Posts
    160
    De JsonToObject die ik gebruik zit gewoon in Rest.json.
    Ik weet hoe ik het kan doen zonder objecten maar vind het gewoon mooier en beter met, maar geen idee hoe ik het moet aanpakken als de result string een array is.

  4. #4
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Voor json maak ik gebruik van System.Json.Writers en System.Json.Readers. Op youtube staat een filmpje van Pawel hoe het werkt. Het is supersnel. Wel heb je minimaal D10 nodig.
    Het is heel makkelijk om een array te lezen.
    Delphi Code:
    1. class function TDatabase.SavetoJSON(const aDirectory : string; aSchedularJobs: TDictionary<string, TSchedulerJob>): boolean;
    2. var
    3.   stringwriter : TStringwriter;
    4.   writer       : TJsonTextWriter;
    5.   job          : TSchedulerJob;
    6.   key          : string;
    7.   JSONText     : string;
    8.   XMLFile      : TStrings;
    9. begin
    10.   result := true;
    11.   stringwriter := TStringwriter.create;
    12.   writer       := TJsonTextWriter.Create(Stringwriter);
    13.   XMLFile      := TStringlist.create;
    14.   try
    15.     writer.Formatting := TJsonFormatting.Indented;
    16.     writer.WriteStartObject;
    17.     writer.WritePropertyName('taakplanner');
    18.     writer.WriteStartArray;
    19.     for key in aSchedularJobs.Keys do
    20.     begin
    21.       aSchedularJobs.TryGetValue(key,job);
    22.       writer.WriteStartObject;
    23.       writer.WritePropertyName('naamtaak');
    24.       writer.WriteValue(job.NaamTaak);
    25.       writer.WritePropertyName('category');
    26.       writer.WriteValue(job.Category);
    27.       writer.WritePropertyName('starttijd');
    28.       writer.WriteValue(job.Starttijd);
    29.       writer.WritePropertyName('eindtijd');
    30.       writer.WriteValue(job.Eindtijd);
    31.       writer.WritePropertyName('interval');
    32.       writer.WriteValue(job.interval);
    33.       writer.WritePropertyName('activeren');
    34.       writer.WriteValue(job.activeren);
    35.       writer.WritePropertyName('eenmalig');
    36.       writer.WriteValue(job.Eenmalig);
    37.       writer.WriteEndObject;
    38.     end;
    39.     writer.WriteEndArray;
    40.     writer.WriteEndObject;
    41.     JSONText := Stringwriter.ToString;
    42.     XMLFile.Text := JSONText;
    43.     XMLFile.SaveToFile(aDirectory + '\taakplanner.json');
    44.  
    45.   finally
    46.     writer.free;
    47.     stringwriter.free;
    48.     XMLFile.free;
    49.     //BSON example
    50.   end;
    51. end;
    Delphi is great. Lazarus is more powerfull

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •