AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

JSON is valid or not

Ein Thema von geldis · begonnen am 22. Jan 2022 · letzter Beitrag vom 23. Jan 2022
Antwort Antwort
geldis

Registriert seit: 19. Jan 2022
39 Beiträge
 
#1

JSON is valid or not

  Alt 22. Jan 2022, 15:42
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: JSON is valid or not

  Alt 22. Jan 2022, 15:51
TJSONObject.ParseJSONValue liefert nil, wenn das JSON nicht geparsed werden kann.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
geldis

Registriert seit: 19. Jan 2022
39 Beiträge
 
#3

AW: JSON is valid or not

  Alt 22. Jan 2022, 16:05
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: JSON is valid or not

  Alt 22. Jan 2022, 16:25
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
geldis

Registriert seit: 19. Jan 2022
39 Beiträge
 
#5

AW: JSON is valid or not

  Alt 22. Jan 2022, 16:52
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#6

AW: JSON is valid or not

  Alt 22. Jan 2022, 17:01
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

AW: JSON is valid or not

  Alt 22. Jan 2022, 17:10
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);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (22. Jan 2022 um 17:27 Uhr)
  Mit Zitat antworten Zitat
geldis

Registriert seit: 19. Jan 2022
39 Beiträge
 
#8

AW: JSON is valid or not

  Alt 22. Jan 2022, 17:18
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
  Mit Zitat antworten Zitat
geldis

Registriert seit: 19. Jan 2022
39 Beiträge
 
#9

AW: JSON is valid or not

  Alt 23. Jan 2022, 17:06
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.

geldis
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:56 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