Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi LkJSON 2. "Datensatz" lesen (https://www.delphipraxis.net/192411-lkjson-2-datensatz-lesen.html)

DelTurbo 16. Apr 2017 14:28


LkJSON 2. "Datensatz" lesen
 
Hallo,
ich habe folgende Daten (nur ein ausschnitt der ersten beiden)
Code:
{
      "id":"0.0.127.in-addr.arpa.",
      "url":"/servers/localhost/zones/0.0.127.in-addr.arpa.",
      "name":"0.0.127.in-addr.arpa",
      "kind":"Master",
      "dnssec":false,
      "masters":[

      ],
      "serial":00000,
      "notified_serial":000000,
      "last_check":0
   },
   {
      "id":"0000.in-addr.arpa.",
      "url":"/servers/localhost/zones/0000.in-addr.arpa.",
      "name":"0000.in-addr.arpa",
      "kind":"Master",
      "dnssec":false,
      "masters":[

      ],
      "serial":00000,
      "notified_serial":0000,
      "last_check":0
   }, usw...
Ich kann die id,url usw. vom 1. Datensatz auslesen. Aber ich finde nicht heraus wie ich an die nächsten "Datensätze" komme. Wäre toll wenn mir da jemand, eventuell mit einem 3-Zeiler, helfen könnte. Ich nutze LkJSON v1.07. Dort sind zwar 5 Samples bei, aber leider nichts was mir helfen würde.

Vielen dank im Voraus

EDIT: Wenn ich du wenig angaben gemacht habe, einfach fragen. Vielen Dank.

DelTurbo 17. Apr 2017 11:57

AW: LkJSON 2. "Datensatz" lesen
 
Damit sich keiner die mühe macht und sucht. Ich habe etwas gefunden. Mein JSON sieht nun so aus.
Code:
[{
      "id":"0.0.127.in-addr.arpa.",
      "url":"/servers/localhost/zones/0.0.127.in-addr.arpa.",
      "name":"0.0.127.in-addr.arpa",
      "kind":"Master",
      "dnssec":false,
      "masters":[

      ],
      "serial":32513,
      "notified_serial":000000,
      "last_check":0
   },
   {
      "id":"0000.in-addr.arpa.",
      "url":"/servers/localhost/zones/0000.in-addr.arpa.",
      "name":"0000.in-addr.arpa",
      "kind":"Master",
      "dnssec":false,
      "masters":[

      ],
      "serial":32513,
      "notified_serial":0000,
      "last_check":0
   }]
Neu sind die [] am Anfang und ende. Dann kann ich das mit diesem Programm auslesen.
Delphi-Quellcode:
program sample6;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  windows,
  classes,
  Variants,
  uLkJSON in 'uLkJSON.pas';

var
  Messages :TlkJSONbase;
  i        :Integer;
begin
    messages:=TlkJSONstreamed.loadfromfile('test1.txt') as TlkJSONbase;
    for I := 0 to messages.Count-1 do begin
        WriteLn(VarToStr(messages.Child[I].Field['url'].Value));
    end;
    readln;
end.
Gefunden habe ich das hier.
Ich kam am anfang mit dem Child nicht klar.

Trotzdem danke an alle und noch einen schönen Ostermontag. Meiner ist gerettet :-D

Memnarch 18. Apr 2017 13:17

AW: LkJSON 2. "Datensatz" lesen
 
Moin,
Wollte nochmal kurz was zum Abschluss sagen, da ich gerade erst auf diesen Thread aufmerksam geworden bin.

Ein JSON-Document darf nur ein Root haben. Du hast aber auf der ersten Ebene mehrere Objekte, ergo musst du(wie du es bereits selbst richtig korrigiert hast) daraus eine Array-Deklaration machen "[...]". Desweiteren sind einige deiner Numerischen Werte nicht strikt Json-kompatibel. Die Zahlen dürfen afaik keine führenden Nullen haben. Deine Serials aber haben 00000, stehen dürfte da aber nur 0. Oder wenn du die Zeichenkette so brauchst, musst du es als String hinschreiben.

Folgende JSon-Validatoren kann ich zu Analyse- und validierungszwecken empfehlen:
https://jsonformatter.curiousconcept.com/
http://jsonlint.com/

Grüße
Memnarh

DelTurbo 18. Apr 2017 13:28

AW: LkJSON 2. "Datensatz" lesen
 
Danke für den Hinweis. Die Nullen habe ich nur rein geschrieben um nicht alle Daten ins Internet zu stellen.

Michael Habbe 6. Aug 2017 21:28

AW: LkJSON 2. "Datensatz" lesen
 
Hi zusammen.

Da ich recht neu im Umgang mit JSON bin, bin ich hier auf lkJSON gestossen.

Gibt es hierfür irgendwo ein paar Demozeilen, die den Umgang hiermit besser erläutern? Habe mit den Demos1-5 angefangen, leider ist es nicht sehr selbsterklärend. :stupid:

Bei den Demozeilen oben
Code:
WriteLn(VarToStr(js.Child[I].Field['customerName'].Value));
ist mir aufgefallen, dass die Childs genau bekannt sein müssen, sonst schmeisst es Zugriffsverletzungen aus. Muss ich jeden Zugriff auf Fields mit try..except abfangen, oder kann man das in der lkJSON.pas aktivieren?

Danke für Infos
Michael

nahpets 6. Aug 2017 21:47

AW: LkJSON 2. "Datensatz" lesen
 
Ich rate mal:
Delphi-Quellcode:
if Assigned(js.Child[I].Field['customerName']) then begin
  WriteLn(VarToStr(js.Child[I].Field['customerName'].Value));
end;

DelTurbo 7. Aug 2017 07:58

AW: LkJSON 2. "Datensatz" lesen
 
Hi,
ich habe es mit try..except gelöst.

Michael Habbe 7. Aug 2017 09:28

AW: LkJSON 2. "Datensatz" lesen
 
Ich habe es mit Assigned probiert und es funktioniert (hätte man eigentlich selbst drauf kommen können :stupid:)

Danke erstmal
Michael

himitsu 7. Aug 2017 10:24

AW: LkJSON 2. "Datensatz" lesen
 
In diesem Fall war das Stichwort "Zugriffsverletzung bei Adresse 000000xx" -> nil.

Und bei Konsolenanwendungen kann ein
Delphi-Quellcode:
Try ... Except WriteLn(E.ClassName, ': ', E.Message); ExitCode := 1;
nicht schaden.


Zitat:

Zitat von DelTurbo (Beitrag 1378229)
Hi,
ich habe es mit try..except gelöst.

Ich möchte den Entwickler immer gern erwürgen, vierteilen und dann steinigen, wenn ich solche Code debuggen muß, wo ständig "sinnlos" der Debugger anspricht und mich stört. :cry:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz