Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Problemme mit DBXJSON (https://www.delphipraxis.net/181053-problemme-mit-dbxjson.html)

Isaev 10. Jul 2014 20:18

Problemme mit DBXJSON
 
hallo,
ich habe ein Paar Problemm mit DBXJSON in DelphiXE getroffen
JSON-Antwort-Beispiel, das muss man parsen:
Code:
{"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]]
 }"
}
1. Wenn wir die Antwort in var JSONText haben, nehmen wir zuerst als ganzes Objekt:

Code:
JSONObj:=TJSONObject.ParseJSONValue(JSONText) As TJSONObject;
Dann nehmen wir 'data' aus:

Code:
JSONData:=TJSONObject.ParseJSONValue(JSONObj.Get('data').JsonValue.Value) As TJSONObject;
Und jetzt muss man 'dat5' ausnehmen, logischerweise so:

Code:
JSONData4:=TJSONObject.ParseJSONValue(JSONData.Get('dat5').JsonValue.Value) As TJSONObject;
geht aber so nicht, wegen backslashs in \"dat5\"

Was kann man tun? (In php wurde alles gut geparst.)

2. Wie kann man Parameter null und true("dat2" und "dat3") auslesen?

mquadrat 11. Jul 2014 08:05

AW: Problemme mit DBXJSON
 
Das JSON ist schlicht ungültig...

Code:
 "data":"{
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

Ergo ist der Fehler eigentlich nicht in Delphi, sondern im generierenden System. Das PHP das parst ist wohl schlicht Glück

Isaev 11. Jul 2014 11:30

AW: Problemme mit DBXJSON
 
Zitat:

Zitat von mquadrat (Beitrag 1265144)
Wenn data absichtlich als Encoded-JSON übergeben wird, dann fehlt das schließende ".

Ja, vielen Dank für den Tipp :thumb:
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.

Isaev 11. Jul 2014 15:15

AW: Problemme mit DBXJSON
 
Ja, es funktioniert!
Und wie liest man einen Boolean-Wert(bei 'dat3') aus? (und null-Wert bei 'dat2')
Code:
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;
ich dachte ungefähr so: StrToBool(JSONData.Get('dat3').JsonValue.Value);
so gibt aber einen leeren String in Value zurück.

Volker Z. 12. Jul 2014 23:25

AW: Problemme mit DBXJSON
 
Hallo,

Zitat:

Und wie liest man einen Boolean-Wert(bei 'dat3') aus? (und null-Wert bei 'dat2')
Vielleicht so:
Delphi-Quellcode:
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;
Vielleicht gibt 's aber auch 'nen besseren Weg :angel2:

Gruß

Isaev 13. Jul 2014 20:53

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 05:53 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