Anzahl an Listitems in einer Json Ermitteln

Für Installationen unter Windows
Antworten
Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Anzahl an Listitems in einer Json Ermitteln

Beitrag von Aloxen »

Hi,
ich habe ein Programm in dem eine Variable einen Jsoncode speichert. Dieser Json Code besteht aus einer Liste mit einer unbestimmten Anzahl an Listitems. Das kommt daher, das der Benuter beliebig oft ein Listitem zu dem "Speicher" hinzufügen soll. In jedem Listitem steht ein Datum. Das programm soll wenn der Benutzer auf einen anderen Button klickt, überprüfen, ob ein eintrag zu dem Datum in der Json vorkommt. Sprich ob es ein Listitem gibt das das Datum hat. Ich hatte gedacht das mit einer For k=0 to ... do schleife zu machen aber das Problem ist das ich nicht weiß wie viele Listitems es gibt.
GIbt es einen befehl der mir die Anzahl der Listitems ausgibt?

Der STring in der Variable mit dem JSon code sieht so aus
{"list":[{"Date":"00-00-000","Time":"00-00","Message":"empty"},{"Date":"01-01-2022","Time":"12-00","Message":"Message"}]}

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Anzahl an Listitems in einer Json Ermitteln

Beitrag von theo »

Also ich weiss nicht genau was du machst und ich weiss nicht ob es schlau ist und ich würde es wahrscheinlich anders lösen, aber
TJSONArray hat ja ein Count Property.

Code: Alles auswählen

uses fpjson, jsonparser;  
...
  var
    J: TJSONData;
    jArray : TJSONArray;
  begin
      J:=GetJSON(Memo1.Text);
      JArray:=J.FindPath('list') as TJSONArray;
      ShowMessage(JArray.Count.ToString);    
...

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: Anzahl an Listitems in einer Json Ermitteln

Beitrag von Aloxen »

Ich schau mir das mal an. Danke.
Ich möchte einen Terminkalender erstellen und alle Einträge die gemacht werden sollen halt in der JSON gespeichert werden. Weil ich KP habe wie man in eine .json Datei schreibt wird quasi jedes mal wenn der Benutzer einen neuen Termin macht erst auf eine Text Datei zugegriffen in der der JSON Code mit der Liste mit allen vorherigen Einträgen ist. Dann wird ein weiterer Eintrag angefertigt und zu der Liste im JSON Format hinzugefügt. Der komplette String im Json format wird dann wieder in der Text Datei gespeichert und beim nächsten Eintrag wieder rausgekramt. Aus einem Stringgrid habe ich bereits einen Kalender erstellt. Und jetzt soll halt bei jeder Zelle geschaut werden ob zu dem Datum ein Eintrag in der Json vorhanden ist und wenn ja die Message und die Uhrzeit unter die Zahl des Datums schreiben. Ich weiß das geht bestimmt einfacher aber ich soll eine externe Datei zum speichern nutzen (#Infounterricht). KP ob man das versteht xD

Code: Alles auswählen

var
  json:String;
  J:TJSONData;
  k:integer;
  Datei:TextFile;
 
 procedure TForm1.FormCreate(Sender: TObject);
begin
  AssignFIle(Datei,'Termin.txt');

 try
   Reset(Datei);
   Readln(Datei,json);
   if json = ''
 then json:='{"list":['+
   '{'+
          '"Date":' + '"' +'00'+ '-' + '00'+ '-' + '000' + '"' + ',' +
          '"Time":' + '"' + '00' + '-' + '00' + '"'+ ',' +
          '"Message":' + '"' + 'empty' + '"' +
       '}]}'
 except
  json:='{"list":['+
   '{'+
          '"Date":' + '"' +'00'+ '-' + '00'+ '-' + '000' + '"' + ',' +
          '"Time":' + '"' + '00' + '-' + '00' + '"'+ ',' +
          '"Message":' + '"' + 'empty' + '"' +
       '}]}';
end;
 CloseFile(Datei);


end;
procedure Tform1.Add_Json(day,Monat,Jahr,Stunde,Minute,Message:string);

begin
  delete(json,(length(json)-1),2);
  json:=json +',{'+
          '"Date":' + '"' +day+ '-' + Monat + '-' + Jahr + '"' + ',' +
          '"Time":' + '"' +Stunde + '-' + Minute + '"'+ ',' +
          '"Message":' + '"' + Message + '"' +
       '}';

  json:=json + ']}';

  AssignFIle(Datei,'Termin.txt');
  Rewrite(Datei);
  Append(Datei);
  Writeln(Datei,json);
  CloseFile(Datei);
  Writeln(json)


end; 
  

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Anzahl an Listitems in einer Json Ermitteln

Beitrag von Thandor »

Schau dir mal die Klasse TJOSNObject aus der Unit fpjson an. Diese Klasse beinhaltet Methoden zum Hinzufügen von Elementen. Ich habe das vor Monaten mal gemacht. Kann aber gerade nicht mehr viel dazu sagen. Einfach mal anschauen und rumspielen.

[Edit:]
TJsoanArray hat bereits eine Add-Funktion. Also braucht mann hier keien Umweg über TJSONObject.

Zum Hinzufügen eines neuen Tabelleneintrags:
1. Ein neues TJSONAData-Objekt erstellen
2. Das Objekt mittes TJSONArray.Add dem JsonArray hinzufügen
3. Mit hilfe TJSONData.ToJson und normalen Dateiopertionen die Json-Datei schreiben

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Anzahl an Listitems in einer Json Ermitteln

Beitrag von theo »

Ich frage mich halt, ob du wirklich JSON brauchst bzw. mit JSONObjects im Speicher arbeiten solltest.
Ein Array of Record oder eine TObjectList würde auch reichen und wäre mehr "Basic".
Zum Speichern/Laden wäre CSV für deinen Fall auch ausreichend.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Anzahl an Listitems in einer Json Ermitteln

Beitrag von fliegermichl »

Sehe ich genauso wie Theo.
JSon hatte ich mal, weil das an einen Webservice übertragen werden musste. Wenn es nur innerhalb des Programmes gebraucht wird, ist eine TList absolut ausreichend.

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: Anzahl an Listitems in einer Json Ermitteln

Beitrag von Aloxen »

Array of Record benutze ich viel, aber das Problem ist, dass mein Programm alle Einträger speichern soll, die je gemacht wurden. Sprich auch nach dem man das Programm beendet hat und wieder öffnet. Der Array wäre ja nach dem beenden weg. Ich weiß das JSON vllt nicht gerade der beste Weg ist aber ich habe noch weniger Ahnung von anderen Typen und erst recht keine Lust mir nen eigen Speicherdateityp zu erstellen xD
Mein Infolehrer hat mir .ini vorgeschlagen

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Anzahl an Listitems in einer Json Ermitteln

Beitrag von theo »

Du brauchst eine Datenstruktur im Speicher und einen Dateityp, bzw eine Art, das zu speichern.
Man kann natürlich auch die Abkürzung nehmen und eine Klasse verwenden, die das schon eingebaut hat.
Z.B. TCSVDocument.
Hier mal ein schnelles Beispiel als Denkanstoss.

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, csvdocument;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    ADoc: TCSVDocument;

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  ADoc := TCSVDocument.Create;
  ADoc.LoadFromFile('/home/theo/ADoc.csv');
  if ADoc.RowCount > 0 then
    for i := 0 to ADoc.RowCount - 1 do
      Memo1.Lines.Add(ADoc.Cells[0, i] + ' - ' + ADoc.Cells[1, i]);
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  ADoc.SaveToFile('/home/theo/ADoc.csv');
  ADoc.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADoc.AddRow(TimeToStr(Now));
  ADoc.AddCell(ADoc.RowCount - 1, 'Message' + IntToStr(ADoc.RowCount));
end;

end.    

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Anzahl an Listitems in einer Json Ermitteln

Beitrag von fliegermichl »

Oder ganz einfach eine typisierte Datei.

Code: Alles auswählen

type
 RMyRec = record
  Id : integer;
  Name : Shortstring;
 end;

 RMyArray = array of RMyRec;
 TMyFile = file of RMyRec;
const
 MyArray : RMyArray = nil;

procedure LoadArray(fName : string);
var afile : TMyFile;
    i : integer;
begin
 AssignFile(aFile, fName);
 try
   Reset(aFile);
   SetLength(MyArray, FileSize(aFile));
   for i := 1 to Length(MyArray) do
     Read(aFile, MyArray[i-1]);
   CloseFile(aFile);
 except
 end;
end;

procedure SaveArray(fName : string);
var afile : TMyFile;
    i : integer;
begin
 AssignFile(aFile, fName);
 try
   ReWrite(aFile);
   for i := 1 to Length(MyArray) do
     Write(aFile, MyArray[i-1]);
   CloseFile(aFile);
 except
 end;
end;

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Anzahl an Listitems in einer Json Ermitteln

Beitrag von theo »

fliegermichl hat geschrieben:
Mo 11. Jul 2022, 09:42
Oder ganz einfach eine typisierte Datei.
Hatte ich mir auch überlegt.
Das hat einfach den Nachteil, dass die Message dann maximal 256 Zeichen lang sein darf.
Vielleicht eine Einschränkung, die nicht in Frage kommt.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Anzahl an Listitems in einer Json Ermitteln

Beitrag von fliegermichl »

Um genau zu sein 255. Das erste ist ja die Länge des Strings.
Ich wollte halt nur auch diese Möglichkeit einmal aufzeigen.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Anzahl an Listitems in einer Json Ermitteln

Beitrag von theo »

fliegermichl hat geschrieben:
Mo 11. Jul 2022, 10:27
Um genau zu sein 255. Das erste ist ja die Länge des Strings.
Da hast du recht. Umso schlimmer! :wink:
fliegermichl hat geschrieben:
Mo 11. Jul 2022, 10:27
Ich wollte halt nur auch diese Möglichkeit einmal aufzeigen.
Schon gut.
Ich hatte das nicht vorgeschlagen, weil ich es selber nicht so lösen würde.
Mit dem CSVDocument hast du keine Einschränkung in der Stringlänge und bekommst "gratis" auch noch gleich ein Datenaustauschformat mit. CSV kann man so ziemlich mit allem öffnen.
Ich glaube Dosenöffner können sogar CSV. :lol:

Antworten