![]() |
DBXJSON in XE4
Hi,
gibt's irgendwo eine durchgängige, verständliche Dokumentation, aus der ich lernen kann, wie ich damit einen JSON-String einlesen, dass Array auslösen und die Elemente auslesen kann? Mit der Delphi-Hilfe probier ich schon Stundenlang rum, komme aber nicht wirklich dahinter, wie ich das jetzt machen soll. Und bei Google finde ich auch nicht wirklich was, was mir den Zusammenhang so erklärt, dass ich das raffe. Im Grund habe ich einen solchen String: {"Uptime":"0T 0H 0M 25S","Wiegungen":"0","Letzte Meldung":"30.12.1899 00:00:00","Waage":"Verbunden"} den ich zerlegen will. |
AW: DBXJSON in XE4
Schau mal in die
![]() |
AW: DBXJSON in XE4
Was ist dein Plan mit "zerlegen"? Die einzelnen Paare da heraus extrahieren?
Ansonsten hier das Beispiel zur grade verlinkten Doku:
Delphi-Quellcode:
program Project25;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, Data.DBXJson, Data.DBXJSONReflect, System.JSON; const meinString = '{"Uptime":"0T 0H 0M 25S","Wiegungen":"0","Letzte Meldung":"30.12.1899 00:00:00","Waage":"Verbunden"}'; procedure justJsonThings(); var jsonObj: TJsonObject; pairIndex: Integer; pair: TJSONPair; begin jsonObj := TJsonObject.ParseJSONValue(meinString) as TJSONObject; try for pairIndex := 0 to Pred(jsonObj.Count) do begin pair := jsonObj.Pairs[pairIndex]; WriteLn(pair.ToJSON()); end; finally jsonObj.Destroy(); end; end; begin try justJsonThings(); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; readln; end.
Delphi-Quellcode:
gab es in XE4 noch nicht, die Typen wie TJsonObject steckten da, glaube ich, noch in
System.Json
Delphi-Quellcode:
.
Data.DBXJSONReflect
Oder willst du (das glaube ich eher) zwischen deinem TWiegeStatus und JSON umwandeln? |
AW: DBXJSON in XE4
Zitat:
Zitat:
Zitat:
|
AW: DBXJSON in XE4
Schau doch in der XE4-Doku:
![]() Statt Count hieß es wohl Size und die Pairs bekommt man über Get() |
AW: DBXJSON in XE4
z.B. So:
Delphi-Quellcode:
program DPJSon;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, Data.DBXJSON; procedure DumpJSON; var LJSONObject : TJSONObject; LJSONPair : TJSONPair; begin LJSONObject := TJSONObject.ParseJSONValue( TEncoding.ASCII.GetBytes('{"Uptime":"0T 0H 0M 25S","Wiegungen":"0","Letzte Meldung":"30.12.1899 00:00:00","Waage":"Verbunden"}'), 0) as TJSONObject; // Alle auflisten for LJSONPair in LJSONObject do begin Write(LJSONPair.JsonString.Value + '='); Writeln(LJSONPair.JsonValue.Value); end; // Einen bestimmten auflisten write('Wert von "Letzte Meldung" '); Writeln(LJSONObject.Get('Letzte Meldung').JsonValue.Value); Readln; end; begin DumpJSON; end. |
AW: DBXJSON in XE4
Ah, jetzt hab ich's kapiert (denke ich mal ;)
Meine Funktion sieht jetzt so aus:
Delphi-Quellcode:
So kann ich mir einfach über den Identifier die dazu gehörige Value aus dem JSON-String holen.
function GetJsonValue (json: string; Identifier: string) : string;
function ExtractQuoteStr(QoutedStr: string): string; begin Result:=QoutedStr; if Result[1]='"' then Result:=Copy(Result, 2, length(Result)); if Result[Length(Result)]='"' then Result:=Copy(Result, 1, length(Result)-1); end; var jsonObj: TJsonObject; pair: TJSONPair; begin Result:=''; jsonObj:=TJSONObject.ParseJSONValue(json) as TJSONObject; try for pair in jsonObj do begin if ExtractQuoteStr(pair.JsonString.ToString)=Identifier then Result:=ExtractQuoteStr(pair.JsonValue.ToString); end; finally jsonObj.Destroy(); end; end; Danke an alle. |
AW: DBXJSON in XE4
Wegen dem
Delphi-Quellcode:
... Hast du dir mal angesehen, was du da zurück bekommst bevor du da noch daran herumwurschtelst?
ExtractQuoteStr
Die Quotes gehören zur JSON-Struktur und dürften im Wert nicht mehr vorkommen, und wenn, dann gehören die zum Wert. |
AW: DBXJSON in XE4
Ja, warum verwendest Du nicht die Get() Methode? Und wenn Du die schon nachprogrammierst, dann solltest Du den richtigen Vergleich verwenden.
Delphi-Quellcode:
if pair.JsonString.Value = Identifier
|
AW: DBXJSON in XE4
Ich hab's halt so gemacht, wie ich es verstehe bzw. verstanden habe.
Wenn ich es besser machen kann, dann nehme ich das gerne an, nur weiß ich leider nicht, was ihr meint. Das JSON Quotes verwendet ist ja schön und gut, aber
Delphi-Quellcode:
liefert mir nun mal die Quotes mit zurück, und die gehören definitiv nicht zum String, sondern die hat mir er mich mit dieser Procedure
pair.JsonValue.ToString
Delphi-Quellcode:
da auch selber reingesetzt. Und weil er sie nunmal nicht selber wieder rausnimmt, hab ich's halt selbst gemacht.
json:=TJSONObject.Create;
for I := 0 to FWaagen.Count-1 do begin if not FWaagen[i].Pfoertner then begin jso:=TJSONObject.Create; jso.AddPair(TJSONPair.Create('Uptime', FWaagen[i].Uptime)); jso.AddPair(TJSONPair.Create('Wiegungen', FWaagen[i].Wiegungen)); jso.AddPair(TJSONPair.Create('Letzte Wiegung', FWaagen[i].LetzteWiegung)); jso.AddPair(TJSONPair.Create('ComStatus', FWaagen[i].ComStatus)); json.AddPair(FWaagen[i].guid, jso.ToString); end; end; Die GetJsonValue-Function habe ich ja schon gepostet. Zitat:
Ich vermute jetzt mal, wenn ich es richtig machen, dann würde er mir die Quotes wohl auch selber rausnehmen (genauso wie das '\"', was ebenfalls gerade zu einem Problem wurde). Mir ist klar, dass ich das noch nicht korrekt gemacht habe, aber ich gebe mir mühe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz