AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Problemme mit DBXJSON

Ein Thema von Isaev · begonnen am 10. Jul 2014 · letzter Beitrag vom 13. Jul 2014
Antwort Antwort
Benutzerbild von Isaev
Isaev

Registriert seit: 4. Jun 2007
Ort: Sachsen
20 Beiträge
 
Delphi XE Architect
 
#1

Problemme mit DBXJSON

  Alt 10. Jul 2014, 20:18
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?

Geändert von Isaev (11. Jul 2014 um 11:31 Uhr)
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Problemme mit DBXJSON

  Alt 11. Jul 2014, 08:05
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

Geändert von mquadrat (11. Jul 2014 um 08:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Isaev
Isaev

Registriert seit: 4. Jun 2007
Ort: Sachsen
20 Beiträge
 
Delphi XE Architect
 
#3

AW: Problemme mit DBXJSON

  Alt 11. Jul 2014, 11:30
Wenn data absichtlich als Encoded-JSON übergeben wird, dann fehlt das schließende ".
Ja, vielen Dank für den Tipp
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.

Geändert von Isaev (11. Jul 2014 um 12:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Isaev
Isaev

Registriert seit: 4. Jun 2007
Ort: Sachsen
20 Beiträge
 
Delphi XE Architect
 
#4

AW: Problemme mit DBXJSON

  Alt 11. Jul 2014, 15:15
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.
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#5

AW: Problemme mit DBXJSON

  Alt 12. Jul 2014, 23:25
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

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Benutzerbild von Isaev
Isaev

Registriert seit: 4. Jun 2007
Ort: Sachsen
20 Beiträge
 
Delphi XE Architect
 
#6

AW: Problemme mit DBXJSON

  Alt 13. Jul 2014, 20:53
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 )
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 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