Anzahl an Listitems in einer Json Ermitteln
Anzahl an Listitems in einer Json Ermitteln
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"}]}
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"}]}
Re: Anzahl an Listitems in einer Json Ermitteln
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.
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);
...
Re: Anzahl an Listitems in einer Json Ermitteln
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
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;
-
- 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
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
[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
Re: Anzahl an Listitems in einer Json Ermitteln
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.
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.
- 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
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.
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.
Re: Anzahl an Listitems in einer Json Ermitteln
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
Mein Infolehrer hat mir .ini vorgeschlagen
Re: Anzahl an Listitems in einer Json Ermitteln
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.
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.
- 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
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;
Re: Anzahl an Listitems in einer Json Ermitteln
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.
- 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
Um genau zu sein 255. Das erste ist ja die Länge des Strings.
Ich wollte halt nur auch diese Möglichkeit einmal aufzeigen.
Ich wollte halt nur auch diese Möglichkeit einmal aufzeigen.
Re: Anzahl an Listitems in einer Json Ermitteln
Da hast du recht. Umso schlimmer!fliegermichl hat geschrieben: ↑Mo 11. Jul 2022, 10:27Um genau zu sein 255. Das erste ist ja die Länge des Strings.
Schon gut.fliegermichl hat geschrieben: ↑Mo 11. Jul 2022, 10:27Ich wollte halt nur auch diese Möglichkeit einmal aufzeigen.
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.