Wie schreibe ich eine grundlegende JSON-Parsing-Klasse?

8

Könnte jemand erklären, wie man eine Klasse schreibt, die JSON-Daten aufnehmen würde und versuchen würde, sie in eine einfache gepufferte Liste zu zerlegen, aus der wir die Daten zurücklesen könnten?

Bsp. JSON

%Vor%

.. wird in eine Tabelle von Schlüsselwertpaaren zerlegt

%Vor%

Wie schreibe ich eine Analyse-Methode, die helfen würde, schneller und einfacher zu erstellen?

Bitte schlagen Sie keine vorhandene Bibliothek vor. Stellen Sie ein Konzept zum Analysieren von JSON bereit.

    
Samual krish 12.06.2013, 10:54
quelle

4 Antworten

19

Diese Antwort geht davon aus, dass Sie wirklich einen Parser schreiben möchten und bereit sind, den erforderlichen Aufwand einzusetzen.

Sie müssen mit der formalen Spezifikation von JSON beginnen. Ich habe Ссылка gefunden. Dies definiert die Sprache genau. Sie MÜSSEN alles in der Spezifikation implementieren und Tests dafür schreiben. Ihr Parser MUSS für falsche JSON (wie Ihre) sorgen und Exceptions werfen.

Wenn Sie einen Parser schreiben möchten, halten Sie an, denken Sie nach und tun Sie es dann nicht. Es ist eine Menge Arbeit, damit es richtig funktioniert. Was auch immer Sie tun, machen Sie einen richtigen Job davon - unvollständige Parser sind eine Bedrohung und sollten nie verteilt werden.

Sie müssen Code schreiben, der konform ist. Hier sind einige Sätze aus der Spezifikation. Wenn Sie sie nicht verstehen, müssen Sie sorgfältig recherchieren und sicherstellen, dass Sie verstehen:

  

"JSON-Text muss in Unicode codiert sein. Die Standardcodierung ist   UTF-8. "

     

"Ein JSON-Parser MUSS alle Texte akzeptieren, die dem JSON entsprechen   Grammatik. "

"Kodierungsüberlegungen: 8bit wenn UTF-8; binär wenn UTF-16 oder UTF-32

%Vor%

"

  

"Jedem Zeichen kann ein Escape-Zeichen zugewiesen werden. Wenn sich das Zeichen im Basis-Format befindet."   Multilingual Plane (U + 0000 bis U + FFFF), dann kann es sein   dargestellt als sechsstellige Sequenz: ein umgekehrter Solidus, gefolgt von   durch den Kleinbuchstaben u, gefolgt von vier hexadezimalen Ziffern, die
  kodiere den Codepunkt des Charakters. Die hexadezimalen Buchstaben A obwohl
  F kann groß oder klein sein. Also zum Beispiel eine Zeichenkette, die ein
enthält   nur ein einzelnes umgekehrtes Solidus-Zeichen kann als Bild dargestellt werden   "\ u005C". "

Wenn Sie diese verstehen und immer noch einen Parser schreiben wollen, dann überprüfen Sie einige andere Parser und sehen Sie, ob einige von ihnen Konformitätstests haben. Leihen Sie diese für Ihre eigene Anwendung aus.

Wenn Sie immer noch daran interessiert sind, sollten Sie einen Parser-Generator in Erwägung ziehen. Beispiele sind JAVACC, CUP und mein bevorzugtes Tool, ANTLR. ANTLR ist sehr mächtig, aber es kann schwierig sein, damit anzufangen. Siehe auch den Vorschlag von Parboiled, den ich jetzt empfehlen würde. JSON ist relativ einfach und es wäre eine nützliche Übung. Die meisten Parsergeneratoren erzeugen einen vollständigen Parser, der ausführbaren Code erzeugen oder den Parsebaum Ihres JSON erzeugen kann.

Es gibt einen JSON-Parser-Generator, der ANTLR in Ссылка verwendet, wenn Sie einen Blick darauf werfen dürfen daran. Ich habe gerade einen Parboiled Parser-Generator für JSON entdeckt. Wenn Ihr Hauptgrund dafür ist, einen Parser zu schreiben, ist es wahrscheinlich ein guter Ausgangspunkt.

Wenn Sie keinen Parser-Generator verwenden dürfen (oder wollen), müssen Sie einen eigenen Parser erstellen. Dies besteht im Allgemeinen aus zwei Teilen:

ein Lexer / Tokenizer . Dies erkennt die grundlegenden Grundelemente, die in der Sprachspezifikation definiert sind. In diesem Fall müsste es geschweifte Klammern, Anführungszeichen usw. erkennen. Es würde wahrscheinlich auch die Repräsentation von Zahlen aufbauen.

ein AbstractSyntaxTree ( Ссылка , AST) Generator . Hier schreiben Sie Code, um einen Baum zusammenzustellen, der die Abstraktion Ihres JSON darstellt (z. B. Leerzeichen und Curlies wurden verworfen).

Wenn Sie die AST haben, sollte es einfach sein, über die Knoten zu iterieren und die gewünschte Ausgabe zu erstellen.

Aber das Schreiben von Parser-Generatoren, selbst für eine einfache Sprache wie JSON, ist eine Menge Arbeit.

    
peter.murray.rust 12.06.2013, 11:06
quelle
4

Wenn dein "JSON" wirklich so ist, solltest du zuerst einen Baseballschläger nehmen und seinen Produzenten über den Kopf schlagen. Ernsthaft.

Wenn Sie wirklich darauf bestehen , Ihre eigene Klasse zu schreiben (warum?), können Sie zum Beispiel eine solche Schnittstelle verwenden:

%Vor%

Implementierungen würden dann ein CharBuffer als Argument und eine Map Builder Klasse nehmen; und zu analysieren würdest du tun:

%Vor%

Dies ist nur ein Beispiel ...

Zweite Lösung, Sie möchten ein vorhandenes Parsingtool verwenden; Sehen Sie sich in diesem Fall Parboiled an. VIEL einfacher zu verwenden als antlr, jflex oder andere, da Sie Ihre Grammatiken in reinem Java schreiben.

Wenn Sie schließlich entscheiden, dass genug ausreicht, und entscheiden Sie sich, eine JSON-Bibliothek zu verwenden (Sie sollten das wirklich tun), gehen Sie zu Jackson , der selbst solche missgebildeten JSONs lesen kann:

%Vor%     
fge 12.06.2013 11:02
quelle
3

Ich habe schon eine geschrieben. Schritte:

  1. Nimm eine Zeichenfolge, die JSON-Text darstellt.

  2. Erstellen Sie eine JsonToken-Klasse. Ich rufe meinen JToken.

  3. Gehen Sie den gesamten Text aus Schritt 1 durch und analysieren Sie die JToken.

  4. Rekursiv gruppieren und verschachteln Sie Ihre JToken.

  5. Versuch, es einfach und einheitlich zu halten. Alle JToken-Knoten verfügen über ein unterordnetes Array, das 0 oder mehr untergeordnete Elemente haben kann. Wenn der Knoten ein Array ist, markieren Sie ihn als Array. Untergeordnete Elemente werden für die untergeordneten Elemente des Knotens verwendet, wenn es sich um ein OBJEKT oder ein ARRAY handelt. Die einzige Sache, die sich ändert, ist, wie es markiert wird. Behalten Sie auch alle Werte als String-Typ bei. Auf diese Weise brauchen Sie nur ein einziges Mitglied auf dem Knoten namens "value", das nach all der harten Arbeit als richtiger Datentyp interpretiert werden kann.

  6. Verwenden Sie defensive Codierung und Komponententests. Schreiben Sie Tests für alle Komponenten des Parsers. Es ist besser, 3 Stunden mehr Zeit mit dem Schreiben von Code auf paranoide Art und Weise zu verbringen, wobei man davon ausgeht, dass man jede Sekunde Fehler macht, als 3 Stunden lang nach Fehlern suchen zu müssen. Code paranoid genug, und Sie werden sehr selten verbringen Zeit frustriert sein beim Debuggen.

Beispielcode: Als ich eine einfache (ironische) Herausforderung auf code-eval.com machte. Es gab eine JSon-Menü Parsing-Herausforderung. Ich dachte, es wäre Betrug um irgendwelche eingebauten Funktionen zu verwenden, weil für mich der ganze Sinn des Codes herausfordert ist es, die Problemlösungsfähigkeiten Ihres Algorithmus zu testen. Die Herausforderung ist hier: Ссылка

Mein Code, der diese Herausforderung besteht, benutzt einen von Grund auf neu erstellten Parser Javascript:

%Vor%

Hinweis: Dieser Code könnte einige Verbesserungen verwenden. Ein Teil davon ist sehr ineffizient und es wird nicht mit Unicode funktionieren.

Ich würde es nicht empfehlen, einen eigenen JSON-Parser zu schreiben, wenn Sie den JSON nicht auf eine Art nicht standardmäßiger Art interpretieren.

Zum Beispiel: Ich benutze JSONedit, um Zweige für eine textbasierte Organisation zu organisieren Abenteuer. Ich verwende nur das JSON-Dateiformat, weil es kompakt ist und der Viewer es mir erlaubt, Elemente zu erweitern und zu kontrahieren. Der Standard-Parser, der mit GOLang geliefert wird, interpretiert die Informationen nicht so, wie ich es interpretieren möchte, also schreibe ich meinen eigenen Parser.

    
J MADISON 14.04.2017 04:00
quelle
0
%Vor%

Sie können ein beliebiges Bean erstellen, indem Sie dieses AbstractMessageObject erweitern. Wann immer Sie dieses Objekt nach json analysieren wollen, müssen Sie nur toString method

aufrufen     
Ruchira Gayan Ranaweera 12.06.2013 11:12
quelle

Tags und Links