Java Integrierter Datenparser für JSON oder XML oder sonst [geschlossen]

8

Ich möchte Daten lesen, die in einer Datei gespeichert sind. Ich habe noch nicht entschieden, in welchem ​​Format ich es speichern soll, aber ich suche nach einem Format, das leicht zu analysieren ist. Anfangs dachte ich, ich würde mit JSON gehen, aber es scheint, dass Java keinen eingebauten Parser für JSON hat.

Die gespeicherten Daten bestehen aus einer Menge von Datensätzen, wobei jeder Datensatz aus einer Reihe von Feldern besteht. Es ist also nicht einfach genug, in einer Textdatei gespeichert zu werden, die Zeile für Zeile gelesen werden kann. Deshalb denke ich, dass ich etwas wie JSON brauche. Aber ich möchte keine externen Bibliotheken hinzufügen, nur um das Format zu analysieren. Irgendwelche Vorschläge? Ich bin neu in Java.

    
sameold 13.02.2012, 07:01
quelle

8 Antworten

16

Während Java viele keine Standard JSON-Parsing-Bibliothek hat, gibt es mehrere verfügbare Bibliotheken, die schnell, zuverlässig und einfach zu verwenden sind. Viele erlauben auch die Verwendung von standardmäßigen Objektbindungsmethoden wie JAXB , die Ihre Deserialisierungszuordnungen definieren Anmerkungen verwenden.

Ich bevorzuge Jackson selbst. Google-GSon ist ebenfalls beliebt, und Sie können sehen, wie einige Leute die beiden in dieser Frage vergleichen.

Sie möchten vielleicht weniger Angst davor haben, externe Bibliotheken zu verwenden. Es ist fast immer besser, eine vorhandene Bibliothek mit den gewünschten Funktionen zu verwenden, anstatt eigene zu erstellen. Und mit Tools wie Maven oder Ivy Um Abhängigkeiten automatisch von Ihrer Projektdefinition zu berechnen und herunterzuladen, gibt es wirklich keinen Grund zu befürchten, Bibliotheken zu verwenden.

Mit dem derzeitigen Stand der Java-XML-Unterstützung sollten Sie XML gleichermaßen verfügbar finden. Diese Antwort enthält ein einfaches Beispiel für die Verwendung von javax.xml.parsers.DocumentBuilder um ein DOM zu generieren.

    
ironchefpython 13.02.2012, 07:04
quelle
10

Wie viele andere darauf hingewiesen haben, liefert Java keine Standard-JSON-Parsing-Bibliothek als Teil des JDK. Wenn Sie JDK-gebündelte Technologie mit absolut KEINE Abhängigkeiten verwenden möchten, haben Sie 3 XML-Parsing-Optionen:

  • XPathFactory - XPath-basierte Analyse. Liest den gesamten XML-Code in eine speicherinterne Datenstruktur und ermöglicht die Ausführung von Abfragen mithilfe der XPath-Ausdruckssprache . Dies ist wahrscheinlich die langsamste und speicherintensivste, ABER, eine der bequemsten Möglichkeiten, um Ihre Daten abzufragen. Du würdest damit keine Aktienhandels-App schreiben, aber wenn du nur Daten aus einer großen Konfigurationsdatei brauchst, ist es sehr praktisch (obwohl es für Configs viele andere spezifische Bibliotheken gibt, die leichter sind als deine eigenen) .
  • DocumentBuilder - DOM-basierte Analyse. Liest das gesamte XML in eine speicherinterne Datenstruktur, die Sie nach Bedarf abfragen und durchlaufen können. 2. langsamste und ziemlich speicherintensive, aber notwendig, wenn Sie wollen / müssen das XML-DOM im Speicher bleiben, so dass Sie daran arbeiten können. Auch praktisch, wenn Sie das DOM als geänderte XML-Datei lesen, abfragen, Änderungen vornehmen und das DOM zurückschreiben möchten.
  • SAXParser - SAX-basierte Analyse. Fast der Schnellste. Durchsucht das XML-Format von oben nach unten und ruft in Ihrem ContentHandler stubbed-Methoden auf Implementierung (bereitgestellt zur Parse-Zeit) jedes Mal, wenn das entsprechende Element getroffen wird. Es ist im Grunde wie eine gesprächige Person, die Ihnen alles sagt, was sie tun, wie sie es tun. Es liegt an Ihnen, die ausgestoßenen Methoden zu implementieren, um tatsächlich etwas mit den Daten zu tun, die Sie bei der Suche passieren.
  • XMLStreamReader - Schnellste Analysemethode und der niedrigste Overhead. Dies ist das neue Golden-Kind des XML-Parsens in Java. Es ähnelt STAX, aber anstatt stubbed-Methoden jedes Mal aufzurufen, wenn etwas Neues gefunden wird, durchläuft es die XML-Datei und benachrichtigt den Aufrufer über seinen geänderten Status, da er neuen Inhalt sieht, aber nichts mit dem Inhalt tut, bis Sie ihn danach fragen . Zum Beispiel sagt es etwas wie "Jetzt schaue ich auf ein offenes Tag ... jetzt ein nahes Tag ... jetzt ein paar Zeichen ... jetzt ein Kommentar ..." und es sei denn, du fragst nach Informationen darüber die Elemente, auf die es trifft (Attribute, Zeichen usw.), parst und verarbeitet sie nie aus dem Stream, sondern überspringt sie einfach.

JETZT ist alles, was gesagt wird, die Arbeit mit diesen APIs, besonders wenn Sie neu sind, nicht die intuitivste der Welt. Wenn Sie schon einmal mit Java in Java geparst haben, wird es Ihnen gut gehen.

Wenn Sie eine kleine 3rd-Party-JAR in Betracht ziehen, werde ich Sie auf meine Einfache Java XML Parser (SJXP) Bibliothek . Es gibt Ihnen die Leichtigkeit von XPath mit der Leistung des STAX-Parsens; ehrlich (ich bin unvoreingenommen, ernsthaft) - es ist fantastisch.

Ich habe mehr als ein Jahr daran gearbeitet, während ich ein wirklich robustes Feed-Parsing-System geschrieben habe, das als SAX-basiertes System begann, dann zu STAX wechselte und je mehr ich daran arbeitete, desto klarer wurde mir, wie einfach ich es konnte abstrahiere die Schmerzen von STAX mit einfachen Regeln.

Sie können sich das Anwendungsbeispiel ansehen, aber Sie definieren es im Wesentlichen Übereinstimmende Regeln wie "/ library / book / title" analysieren alle Ihre Tag-Inhalte; Sie können Attribute und sogar Namespace-qualifizierte Werte analysieren (ja, es unterstützt auch Namespaces!)

Hier ist ein RSS-Feed-Parser-Beispiel:

%Vor%

Dann übergeben Sie diese Regel einfach an den Parser, wenn Sie ihn wie folgt erstellen:

%Vor%

Und du bist fertig; geben Sie dem Parser einfach Ihre XML-Dateien über Parse-Methode und Sie erhalten jedesmal Callbacks, wenn der Pfad übereinstimmt.

Ich habe den Overhead der Bibliothek über STAX bis zu dem Punkt, an dem er messbar nicht existiert, bewertet, profiliert und optimiert. Der eigentliche Patch-Abgleich erfolgt über zwischengespeicherte Hash-Codes, so dass ich im Parser nicht einmal Zeichenfolgenvergleiche durchführe.

Es ist wirklich schnell und funktioniert unter Android.

>

Wenn Sie stattdessen JSON verwenden möchten, empfehle ich dringend, GSON zu verwenden. Jackson ist schneller, aber die API ist 37x komplexer als die GSON API.Sie werden mehr Zeit damit verbringen, genau herauszufinden, welche Klassen Sie in Jackson verwenden müssen, als Sie es mit GSON können.

Auch seit der letzten GSON-Version und dem Neuschreiben des Stream-Parsers wurde die Geschwindigkeitslücke ziemlich geschlossen; Sie können den Stream-Parser impl ihrer verwenden, um die Analysegeschwindigkeit von Jackson zu erhalten, wenn das kritisch ist.

Wenn Sie gesagt haben, ULTIMATE Geschwindigkeit über alles hinaus und das ist Priorität # 1, dann verwenden Sie Jackson.

    
Riyad Kalla 15.02.2012 15:55
quelle
6

Ich verwende GSON: Ссылка , um JSON zu analysieren. Es ist sehr einfach zu bedienen:

%Vor%

zum Deserialisieren von JSON verwenden:

%Vor%

Weitere Beispiele finden Sie hier: Ссылка

    
wlk 13.02.2012 07:11
quelle
5

Sie haben das bereits akzeptiert, aber allen scheint die Tatsache zu fehlen, dass Java über eine Standard-JSON-Bibliothek verfügt. Seit JDK 7 gibt es eine javax.json Paket in der Standardbibliothek.

    
jiggy 09.08.2014 19:27
quelle
1

Java bietet SAXParser zum Parsen von XML an.

    
Husain Basrawala 13.02.2012 07:06
quelle
1

Wenn Sie NetBeans programmieren, können Sie dtd verwenden, um einen XML-Scanner zu erstellen. Klicken Sie einfach mit der rechten Maustaste auf die Datei dtd und wählen Sie "DOM-Scanner generieren"

    
Uko 13.02.2012 07:26
quelle
0

javax.json ist das Java-Paket - beachten Sie auch, dass es eine extrem leichte Java-Alternative zu SAX gibt, genannt StAX (Streaming-API für XML) .

JSON v XML in der App, die Sie vorschlagen, hängt meiner Meinung nach viel mehr davon ab, was Sie mit den Daten tun werden und wie Sie es verarbeiten werden. Wenn Sie beispielsweise die Daten an eine Webseite senden und die Objektnotation verwenden müssen, um sie mit JavaScript zu verarbeiten, ist JSON die offensichtliche Wahl. Wenn Sie es nur anzeigen möchten, sollten Sie XHTML in Betracht ziehen und Ihr Backend auswählen, was angezeigt wird. Wenn Sie Daten zwischen verschiedenen Industriecomputern in B2B-Anwendungen übertragen, müssen Sie wahrscheinlich XML und Tags verwenden, die durch Industriestandards definiert sind.

    
Roger F. Gay 13.07.2015 10:22
quelle
-1

JSON ist großartig, besser als XML.

Warum möchten Sie keine externen Bibliotheken hinzufügen? Wenn Sie wirklich nicht verwenden können, können Sie einen Parser neu schreiben. Die Implementierung eines Parsers ist nicht allzu schwierig.

    
Mavlarn 13.02.2012 07:55
quelle

Tags und Links