{"id":3891,"date":"2017-06-25T13:07:38","date_gmt":"2017-06-25T11:07:38","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=3891"},"modified":"2017-06-25T13:07:38","modified_gmt":"2017-06-25T11:07:38","slug":"json-verarbeitung-mit-der-java-api-for-json-processing","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2017\/06\/json-verarbeitung-mit-der-java-api-for-json-processing\/","title":{"rendered":"JSON-Verarbeitung mit der Java API for JSON Processing"},"content":{"rendered":"<p>Zum Verarbeiten von JSON-Dokumenten gibt es in der Java SE keine Standardklassen, sodass sich eine Reihe von Open-Source-Bibliotheken herausgepr\u00e4gt haben; Jackson (http:\/\/tutego.de\/go\/jackson) geh\u00f6rt zu den popul\u00e4rsten L\u00f6sungen. 2013 wurde dann die JSR 353, \u201eJava API for JSON Processing\u201c verabschiedet, die Teil der Java EE 7 ist.<\/p>\n<p>Wir k\u00f6nnen die JSON-API in unseren Java SE-Programmen nutzen, m\u00fcssen daf\u00fcr aber Java-Archive im Klassenpfad einbinden. Die Referenzimplementierung befindet sich unter https:\/\/javaee.github.io\/jsonp\/. Am Einfachsten haben es Maven-Nutzer, sie binden in ihre POM folgende Abh\u00e4ngigkeiten ein:<\/p>\n<pre>&lt;dependency&gt;\n\n\u00a0 &lt;groupId&gt;javax.json&lt;\/groupId&gt;\n\n\u00a0 &lt;artifactId&gt;javax.json-api&lt;\/artifactId&gt;\n\n\u00a0 &lt;version&gt;1.1&lt;\/version&gt;\n\n&lt;\/dependency&gt;\n\n&lt;dependency&gt;\n\n\u00a0 &lt;groupId&gt;org.glassfish&lt;\/groupId&gt;\n\n\u00a0 &lt;artifactId&gt;javax.json&lt;\/artifactId&gt;\n\n\u00a0 &lt;version&gt;1.1&lt;\/version&gt;\n\n&lt;\/dependency&gt;<\/pre>\n<h4>Aufbauen von JSON-Objekten, Formatieren und Parsen<\/h4>\n<p>Der Typ JsonObject ist in der API zentral, denn er definiert ein hierarchisches Model mit den Schl\u00fcssel-Wertepaaren eines JSON-Objekts. Um ein JsonObject aufzubauen k\u00f6nnen wir \u00fcber den JsonObjectBuilder gehen, oder wir lassen den Parser JsonReader aus einer String-Repr\u00e4sentation ein JsonObject erzeugen. Zum formatierten Schreiben in einen Ausgabestrom k\u00f6nnen wir einen einfachen JsonWriter von der Json-Klasse holen \u2013 es geht aber noch einfacher \u00fcber toString() \u2013 oder \u00fcber die JsonWriterFactory arbeiten, falls wir eine h\u00fcbsche einger\u00fcckte Ausgabe w\u00fcnschen. Ein Beispiel:<\/p>\n<pre>Point p = new Point( 10, 20 );\n\n<strong>JsonObjectBuilder<\/strong> objBuilder = <strong>Json.createObjectBuilder()<\/strong>\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .<strong>add<\/strong>( \"x\", p.x )\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .<strong>add<\/strong>( \"y\", p.y );\n\n<strong>JsonObject<\/strong> jsonObj = objBuilder.build();\n\n\nSystem.out.println( jsonObj );\u00a0 \/\/ {\"x\":10,\"y\":20}\n\n\n<strong>Json.createWriter<\/strong>( System.out ).<strong>write<\/strong>( jsonObj ); \/\/ {\"x\":10,\"y\":20}\n\n\nMap&lt;String, Boolean&gt; config = new HashMap&lt;&gt;();\n\nconfig.put( JsonGenerator.PRETTY_PRINTING, true );\n\n<strong>JsonWriterFactory<\/strong> writerFactory = <strong>Json.createWriterFactory<\/strong>( config );\n\n\nStringWriter out = new StringWriter();\n\n<strong>writerFactory.createWriter( out ).write( jsonObj )<\/strong>;\n\nSystem.out.println( out );\u00a0 \/\/ {\\n\u00a0\u00a0\u00a0 \"x\": 10, ...\n\n\n<strong>JsonReader<\/strong> reader = <strong>Json.createReader<\/strong>( new StringReader( out.toString() ) );\n\nSystem.out.println( <strong>reader.readObject().getInt<\/strong>( \"x\" ) ); \/\/ 10<\/pre>\n<p>Soll der assoziierte Wert ein Array sein, so wird dieser mit Json.createArrayBuilder().add(..).add(..) aufgebaut und gef\u00fcllt.<\/p>\n<h4>JSON-Streaming API<\/h4>\n<p>So wie es f\u00fcr XML eine Pull-API gibt, existiert diese auch f\u00fcr JSON-Dokumente; das ist von Vorteil, wenn die Daten sehr gro\u00df sind. Ein Beispiel zeigt das sehr gut:<\/p>\n<pre>URL url = new URL( \"https:\/\/data.cityofnewyork.us\/api\/views\/25th-nujf\/rows.json?accessType=DOWNLOAD\" );\n\n\n\ntry ( <strong>JsonParser parser = Json.createParser<\/strong>( url.openStream() ) ) {\n\n\u00a0 while ( <strong>parser.hasNext()<\/strong> ) {\n\n\u00a0\u00a0\u00a0 switch ( <strong>parser.next()<\/strong> ) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 case <strong>KEY_NAME<\/strong>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 case <strong>VALUE_STRING<\/strong>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println( <strong>parser.getString()<\/strong> );\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 case <strong>VALUE_NUMBER<\/strong>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println( <strong>parser.getBigDecimal()<\/strong> );\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 case <strong>VALUE_TRUE<\/strong>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println( true );\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 case <strong>VALUE_FALSE<\/strong>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println( false );\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 case <strong>VALUE_NULL<\/strong>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 case <strong>START_ARRAY<\/strong>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 case <strong>END_ARRAY<\/strong>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 case <strong>START_OBJECT<\/strong>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 case <strong>END_OBJECT<\/strong>:\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Ignore\n\n\u00a0\u00a0\u00a0 }\n\n\u00a0 }\n\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Zum Verarbeiten von JSON-Dokumenten gibt es in der Java SE keine Standardklassen, sodass sich eine Reihe von Open-Source-Bibliotheken herausgepr\u00e4gt haben; Jackson (http:\/\/tutego.de\/go\/jackson) geh\u00f6rt zu den popul\u00e4rsten L\u00f6sungen. 2013 wurde dann die JSR 353, \u201eJava API for JSON Processing\u201c verabschiedet, die Teil der Java EE 7 ist. Wir k\u00f6nnen die JSON-API in unseren Java SE-Programmen nutzen, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1,11],"tags":[],"class_list":["post-3891","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3891","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=3891"}],"version-history":[{"count":3,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3891\/revisions"}],"predecessor-version":[{"id":3894,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3891\/revisions\/3894"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=3891"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=3891"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=3891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}