![]() |
Problemme mit DBXJSON
hallo,
ich habe ein Paar Problemm mit DBXJSON in DelphiXE getroffen JSON-Antwort-Beispiel, das muss man parsen:
Code:
1. Wenn wir die Antwort in var JSONText haben, nehmen wir zuerst als ganzes Objekt:
{"num1":631,
"num2":31, "num3":64, "data":"{ \"dat1\":[0,1,2,3,4], \"dat2\":null, \"dat3\":true, \"dat4\":[1,1,1,1,1], \"dat5\":{ \"dat4str1\":11, \"dat4str2\":0, \"dat4str3\":0, \"dat4str4\":2 }, \"sdata\":{ \"sdata1\":12, \"sdata2\":48, \"sdata3\":395, }, \"dat5\":[[0,1,1],[0,1,1],[0,1,1]] }" }
Code:
Dann nehmen wir 'data' aus:
JSONObj:=TJSONObject.ParseJSONValue(JSONText) As TJSONObject;
Code:
Und jetzt muss man 'dat5' ausnehmen, logischerweise so:
JSONData:=TJSONObject.ParseJSONValue(JSONObj.Get('data').JsonValue.Value) As TJSONObject;
Code:
geht aber so nicht, wegen backslashs in \"dat5\"
JSONData4:=TJSONObject.ParseJSONValue(JSONData.Get('dat5').JsonValue.Value) As TJSONObject;
Was kann man tun? (In php wurde alles gut geparst.) 2. Wie kann man Parameter null und true("dat2" und "dat3") auslesen? |
AW: Problemme mit DBXJSON
Das JSON ist schlicht ungültig...
Code:
Hinter den Doppelpunkt gehört kein ", falls es sich um EINE Struktur handelt. Wenn data absichtlich als Encoded-JSON übergeben wird, dann fehlt das schließende ". Im zweiten Fall musst du - nachdem die Struktur korrigiert wurde - data als String auslesen und diesen String wieder durch den JSON Parser jagen
"data":"{
Ergo ist der Fehler eigentlich nicht in Delphi, sondern im generierenden System. Das PHP das parst ist wohl schlicht Glück |
AW: Problemme mit DBXJSON
Zitat:
Bei mir ist der zweite Fall. Es gibt das schließende ", ich habe falsch geschrieben... Ich habe gerade korregiert. Probiere mal, wenn ich zuhause bin. |
AW: Problemme mit DBXJSON
Ja, es funktioniert!
Und wie liest man einen Boolean-Wert(bei 'dat3') aus? (und null-Wert bei 'dat2')
Code:
ich dachte ungefähr so: StrToBool(JSONData.Get('dat3').JsonValue.Value);
var
flag:Boolean; Begin JSONObj:=TJSONObject.ParseJSONValue(JSONText) As TJSONObject; JSONData:=TJSONObject.ParseJSONValue(TJSONObject.ParseJSONValue(JSONObj.Get('data').JsonValue.Value).ToString) As TJSONObject; flag:=??? End; so gibt aber einen leeren String in Value zurück. |
AW: Problemme mit DBXJSON
Hallo,
Zitat:
Delphi-Quellcode:
Vielleicht gibt 's aber auch 'nen besseren Weg :angel2:
const
JSON = '{' + '"num1":631,' + '"num2":31,' + '"num3":64,' + '"data":"{' + '\"dat1\":[0,1,2,3,4],' + '\"dat2\":null,' + '\"dat3\":true,' + '\"dat4\":[1,1,1,1,1],' + '\"dat5\":{' + '\"dat4str1\":11,' + '\"dat4str2\":0,' + '\"dat4str3\":0,' + '\"dat4str4\":2' + '},' + '\"sdata\":{' + '\"sdata1\":12,' + '\"sdata2\":48,' + '\"sdata3\":395' + '},' + '\"dat5\":[[0,1,1],[0,1,1],[0,1,1]]' + '}"' + '}'; function GetJsonValue (Source : string; const PairNames : array of string) : string; var s : TJSONObject; i : Integer; p : TJSONPair; begin Result := ''; if (Trim (Source) = '') or (High (PairNames) = -1) then Exit; s := TJSONObject.Create; try p := nil; try for i := Low (PairNames) to High (PairNames) do begin s.Parse(BytesOf (Source), 0); p := s.Get(PairNames [i]); if not Assigned (p) then Exit; Source := p.JsonValue.Value; if Source = '' then Source := p.JsonValue.ToString end; Result := p.JsonValue.ToString except // Fehlerbehandlung end; finally s.Free end end; procedure TForm1.Button2Click(Sender: TObject); begin Label2.Text := GetJsonValue (JSON, ['data', 'dat2']) end; procedure TForm1.Button3Click(Sender: TObject); begin Label3.Text := GetJsonValue (JSON, ['data', 'dat3']) end; Gruß |
AW: Problemme mit DBXJSON
Volker Z., Vielen Dank! Es ist genial
Value ist String... toString ist String Ich habe gar nicht erwartet, dass die nicht die gleiche Strings sind ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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