Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   JSON is valid or not (https://www.delphipraxis.net/209788-json-valid-not.html)

geldis 22. Jan 2022 14:42

JSON is valid or not
 
Hallo allerseits, ich neu hier.
Ich arbeite schon länger mit Delphi und habe mit einige sehr hilfreiche Infos hier abgeholt. Dank an Alle!
Aber jetzt muss ich direkt etwas fragen:

Ich habe etliche, gleiche JSON Dateien. Daten rausholen und lesen ist kein Problem.

Ich möchte allerdings BEVOR ich diese JSON lese testen ob die JSON Datei valide ist. Es gibt ja etliche OnlineTools die das machen.

Beispiel:
Code:
{
  "Image" : null,
  "Version": "1.1",
  "ID": "4711",
  "Info": {
    "English": "Nothing",
    "French": "Nothing,
    "German": "Nothing"
  },
 
  ...... noch viel länger .....
 
}
In diesem kurzen Stück der JSON fehlt hinter "French": "Nothing, das Anführungszeichen. Das gibt einen Fehler beim Werte lesen. Das würde ich gerne VORHER durch einen "Gesamtest" der JSON prüfen die elend lang sind.

TJSON gibt da nicht recht was her. Hat jemand eine Idee? Übersehe ich etwas?

geldis

Uwe Raabe 22. Jan 2022 14:51

AW: JSON is valid or not
 
Delphi-Quellcode:
TJSONObject.ParseJSONValue
liefert nil, wenn das JSON nicht geparsed werden kann.

geldis 22. Jan 2022 15:05

AW: JSON is valid or not
 
Hoppla, rasend schnell.

Das hatte ich auch schon versucht. Als Wert habe ich die JSON Datei geladen und dann schlicht

Code:

   If TJSonObject.ParseJSONValue(Stringlist.text) = nil then ....
JEDE JSON ist in diesem Fall NIL. Stehe ich auf der Leitung ... ?

geldis

Uwe Raabe 22. Jan 2022 15:25

AW: JSON is valid or not
 
Zitat:

Zitat von geldis (Beitrag 1501039)
JEDE JSON ist in diesem Fall NIL. Stehe ich auf der Leitung ... ?

Na ja, JEDE sicher nicht. Dafür gibt es genügend Gegenbeispiele.

Zeig doch mal ein paar JSON-Strings mit denen es nicht klappt.

geldis 22. Jan 2022 15:52

AW: JSON is valid or not
 
Okay.

Eine der kleineren typischen Dateien:
Code:
{
  "Version": "1",
  "ID": "Zeptor",
  "IncompatibleIds": ["Jokola"],
  "Dependent": null,
  "Lapforce": {
    "English": "much",
    "French": null,
    "German": "Viel",
    "Italian": null,
    "Japanese": null,
    "Korean": null,
    "Polish": null,
    "Russian": null,
    "Spanish": null,
    "Taiwanese": null
  },
  "Name": "Turandot",
  "Contact": "",
  "Image" : null
}

Der Code für Testzwecke :
Delphi-Quellcode:
procedure TMainForm.TestBtnClick(Sender: TObject);
var
TEST : TSTringlist;
begin
  Test := TStringlist.Create;
  Test.LoadFromFile('F:\Zerberus\Json\info.JSON');
  If TJsonObject.ParseJsonValue(Test.Text) = nil then Shomessage('Error') else Showmessage('No Error');
end;
Bei 78 Dateien ist immer Error.

geldis

Uwe Raabe 22. Jan 2022 16:01

AW: JSON is valid or not
 
Dann stimmt was mit deinen Dateien nicht. Ob ich das Json als String-Konstante oder in einer Datei speichere, ich bekomme immer No Error.
Delphi-Quellcode:
const
  cJson = ' {'#13#10 +                        // 0
    ' "Version": "1",'#13#10 +                // 1
    ' "ID": "Zeptor",'#13#10 +                // 2
    ' "IncompatibleIds": ["Jokola"],'#13#10 + // 3
    ' "Dependent": null,'#13#10 +             // 4
    ' "Lapforce": {'#13#10 +                  // 5
    '   "English": "much",'#13#10 +           // 6
    '   "French": null,'#13#10 +              // 7
    '   "German": "Viel",'#13#10 +            // 8
    '   "Italian": null,'#13#10 +             // 9
    '   "Japanese": null,'#13#10 +            // 10
    '   "Korean": null,'#13#10 +              // 11
    '   "Polish": null,'#13#10 +              // 12
    '   "Russian": null,'#13#10 +             // 13
    '   "Spanish": null,'#13#10 +             // 14
    '   "Taiwanese": null'#13#10 +            // 15
    ' },'#13#10 +                             // 16
    ' "Name": "Turandot",'#13#10 +            // 17
    ' "Contact": "",'#13#10 +                 // 18
    ' "Image" : null'#13#10 +                 // 19
    '}'#13#10;                                // 20
var
  TEST: TSTringlist;
begin
  TEST := TSTringlist.Create;
  try
    TEST.Text := cJson;
    if TJsonObject.ParseJsonValue(TEST.Text) = nil then
      Showmessage('Error')
    else
      Showmessage('No Error');
  finally
    TEST.Free;
  end;
end;

himitsu 22. Jan 2022 16:10

AW: JSON is valid or not
 
Irgendwelche Sonder-/Steuerzeichen, die nur wie Leerzeichen aussehn oder nicht sichtbar sind?


Erstmal sollte man Fehler immer richtig behandeln und nicht irgendwelche sinnlose Texte rausgeben, denn "Error" sagt ja garnichts.

Delphi-Quellcode:
var Obj: TJSONValue;
try
  Obj := TJsonObject.ParseJsonValue(Test.Text, {UseBool: True oder False} False, {RaiseExc: die Exception} True);
except
  on E: EJSONParseException do begin
    ShowMessage('JSON-Error in TestBtnClick: ' + E.Message)
    // oder E.Message := 'JSON-Error in TestBtnClick: ' + E.Message; Application.ShowException(E);
    // oder E.Message := 'JSON-Error in TestBtnClick: ' + E.Message; System.SysUtils.ShowException(E, System.ExceptAddr);
    // oder einfach nur "Raise;" , was hier im ButtonClick dann in Application.ShowException enden wird
    // oder das Try-Except weglassen und direkt im Application.ShowException landen
    // oder E.Line und E.Offset auswerten
    // oder E.Position
    // und eventuell auch noch E.Path, aber den Pfad kennst du hier ja schon
  end;
end;
//ShowMessage('No Error');
Delphi-Quellcode:
ErrorText := Copy(Test.Text, E.Position, 15); // eventuell noch Low(Char) zur Position dazurechnen ... weiß nicht ob Position bei 1 oder 0 beginnt
// hier im ErrorText unlesbare Zeichen (z.B. kleiner ' ' oder größer #127) durch "Lesbares" ersetzen
E.Message := 'JSON-Error in TestBtnClick: ' E.Message + sLineBreak + sLineBreak + 'Fehlerstelle: »' + ErrorText + '«';
Application.ShowException(E);

geldis 22. Jan 2022 16:18

AW: JSON is valid or not
 
Tja, muss wohl.

Da bleibt nur Einzelforschung.

Aber nicht mehr heute.

Vielen dank für die Hilfe, wenn sich das klärt melde ich mich.

geldis

geldis 23. Jan 2022 16:06

AW: JSON is valid or not
 
Hallo.

@himitsu
Natürlich : korrekte Fehlerbehandlung. Zu dem Zeitpunkt gestern hat mein Parser der die Daten ausliest keinen Fehler gemeldet. Da die JSON sehr gross sind (~3MB) wollte ich wie oben ausgeführt einfach vor der Lesearie über die ganze Datei prüfen. Und zum Zwecke des ausprobierens des von Uwe gegebenen Tipps schien mir der kleine Codeschnipsel erstmal ausreichend.

Und wie die Fehlersuche jetzt ergab: Das hätte ich programmatisch nur mit viel TamTam finden können. Die JSON kommen von aussen, werden von einem naderen Programm generiert. Und diese Miststück macht an einer Stelle - an einer einzigen Stelle - ein Semikolon anstelle eines Doppelpunktes.

Auch zwei Online Validierer haben den Mist nicht gefunden.


Aber gut, jetzt geht's. Vielen Dank nochmal.:thumb:

geldis


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 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