Dies ist kein einfaches Problem zu lösen. Hauptsächlich, weil das Schreiben eines JSON-Parsers nicht-trivial ist, und ich bezweifle, dass Sie in der Lage wären, einen Parser so anzupassen, dass er so funktioniert, wie Sie möchten.
Wenn ich dieses Problem unbedingt programmgesteuert lösen musste (um den Hersteller zu bitten, ihren JSON zu reparieren), würde ich es wahrscheinlich mit Verzweigung tun.
Unter Ihrem Beispiel JSON-String:
{"DisplayName":""fat" Tony Elvis ","Time":null,"OverallRank":19,"AgeRank":4}
zuerst die Eingabe in Zeichen aufzubrechen und über sie iterieren. Jedes Mal, wenn ein Angebot angetroffen wird, werden beide Möglichkeiten rekursiviert und getestet: Das Angebot ist Teil des JSON und das Angebot ist Teil der Daten.
Jedes Mal, wenn Sie ein Angebot finden Sie verzweigen, so dass nach zwei Zitaten wird es vier mögliche gültige Lösungen sein, nach vier Anführungszeichen es 16 sein werden mögliche Lösungen usw.
Wie Sie dies tun, streame jede mögliche Lösung in einen Stream-JSON-Parser (like this one) und beobachte Ausnahmen. Wenn man geworfen wird, nehme an, die mögliche Lösung funktioniert nicht und wirf sie weg. Ich würde auch nach einer Tiefe von 4 (oder 8, wenn Sie doppelt zitierte Strings in Ihren Daten erwarten) wegwerfen. Durch die Begrenzung der Tiefe werden auch Lösungen wie {"a\":\"b\", \"c"}
davon abgehalten, als gültig zurückgegeben zu werden.
Eigentlich bauen diese zumindest einige Stunden dauern würde, wahrscheinlich ein paar Tage richtig zu machen, und es gibt immer noch eine gute Möglichkeit, es falsch-positive Ergebnisse berichten werde. Es wird auch langsam als Hund sein, weil Sie möglicherweise Tausende von verschiedenen JSON-Streams mit Ruby analysieren müssen, anstatt einen mit einer C-JSON-Bibliothek zu analysieren.
Sie könnten einige der Performance-Probleme lindern, indem sie alle möglichen Lösungen in eine Warteschlange anhängen und einen Pool von Arbeitsthreads verwenden, um mögliche Lösungen und die Arbeit an ihnen zu holen; Aber jetzt reden wir vielleicht über eine Woche Arbeit, um diese Daten mit einem Skript zu bereinigen.
Natürlich können Sie versuchen, den JSON zu korrigieren, aber was würden Sie mit '{" a ":", "b": 1 "}' tun. Sie sollten kein ungültiges JSON akzeptieren, da es sich um einen unsicheren und unvorhersehbaren Wert handelt und Sie einfach entkommen können. z.B. '\" fat \ "wäre gültig. – Julian
Ich möchte den fehlerhaften JSON (in der oben beschriebenen Weise) wenn möglich korrigieren. Wenn das nicht möglich ist, dann ist das auch eine Antwort. –
Sie müssten im Grunde Ihren eigenen Json Fixer machen. Vielleicht teilen Sie die Zeichenfolge, wo Sie finden "," und andere Variationen mit Leerzeichen/neue Zeilen dazwischen, dann nehmen Sie alles nach jedem ':', nehmen Sie die erste und letzte doppelte Anführungszeichen und ersetzen Sie schließlich jedes doppelte Anführungszeichen durch eine einzige , beispielsweise. Dann könnten Sie es im Parser verwenden. Ein anderer Weg wäre, den JSON-Anbieter zu kontaktieren und sie bitten, einen gültigen JSON zur Verfügung zu stellen. – George