| <!DOCTYPE html> |
| <!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--> |
| <!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--> |
| <!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--> |
| <!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head> |
| <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><meta name='keywords' content='groovy, json, scripting, ginq, gquery, gradle, graalvm, native'/><meta name='description' content='This post looks at parsing JSON using Groovy's in-built capabilities as well as some other libraries.'/><title>The Apache Groovy programming language - Blogs - Parsing JSON with Groovy</title><link href='../img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='../css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='../css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='../css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/> |
| </head><body> |
| <div id='fork-me'> |
| <a href='https://github.com/apache/groovy'> |
| <img style='position: fixed; top: 20px; right: -58px; border: 0; z-index: 100; transform: rotate(45deg);' src='/img/horizontal-github-ribbon.png'/> |
| </a> |
| </div><div id='st-container' class='st-container st-effect-9'> |
| <nav class='st-menu st-effect-9' id='menu-12'> |
| <h2 class='icon icon-lab'>Socialize</h2><ul> |
| <li> |
| <a href='https://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a> |
| </li><li> |
| <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a> |
| </li><li> |
| <a href='https://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a> |
| </li><li> |
| <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a> |
| </li><li> |
| <a href='https://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a> |
| </li><li> |
| <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a> |
| </li><li> |
| <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a> |
| </li> |
| </ul> |
| </nav><div class='st-pusher'> |
| <div class='st-content'> |
| <div class='st-content-inner'> |
| <!--[if lt IE 7]> |
| <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p> |
| <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'> |
| <div class='container'> |
| <div class='navbar-header'> |
| <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'> |
| <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span> |
| </button><a class='navbar-brand' href='../index.html'> |
| <i class='fa fa-star'></i> Apache Groovy |
| </a> |
| </div><div class='navbar-collapse collapse'> |
| <ul class='nav navbar-nav navbar-right'> |
| <li class=''><a href='https://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='https://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='/download.html'>Download</a></li><li class=''><a href='https://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='/'>Contribute</a></li><li class=''><a href='https://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li class=''><a href='/blog'>Blog posts</a></li><li class=''><a href='https://groovy.apache.org/events.html'></a></li><li> |
| <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a> |
| </li><li class=''> |
| <a href='../search.html'> |
| <i class='fa fa-search'></i> |
| </a> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Parsing JSON with Groovy</a></li><li><a href='#_batteries_included_experience' class='anchor-link'>Batteries included experience</a></li><li><a href='#_gradle' class='anchor-link'>Gradle</a></li><li><a href='#_maven' class='anchor-link'>Maven</a></li><li><a href='#_advanced_features' class='anchor-link'>Advanced features</a></li><li><a href='#_other_json_libraries' class='anchor-link'>Other JSON libraries</a></li><li><a href='#_integrated_query' class='anchor-link'>Integrated query</a></li><li><a href='#_quick_performance_comparison' class='anchor-link'>Quick performance comparison</a></li><li><a href='#_summary' class='anchor-link'>Summary</a></li></ul><br/><ul class='nav-sidebar'><li style='padding: 0.35em 0.625em; background-color: #eee'><span>Related posts</span></li><li><a href='./groovy-dauphine'>Processing Results for the Critérium du Dauphiné</a></li><li><a href='./working-with-sql-databases-with'>Working with SQL databases with Groovy and GraalVM</a></li><li><a href='./classifying-iris-flowers-with-deep'>Classifying Iris Flowers with Deep Learning, Groovy and GraalVM</a></li><li><a href='./groovy-list-processing-cheat-sheet'>Groovy List Processing Cheat Sheet</a></li><li><a href='./zipping-collections-with-groovy'>Zipping Collections with Groovy</a></li><li><a href='./comparators-and-sorting-in-groovy'>Comparators and Sorting in Groovy</a></li><li><a href='./detecting-objects-with-groovy-the'>Detecting objects with Groovy, the Deep Java Library (DJL), and Apache MXNet</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>Parsing JSON with Groovy</h1><p><span>Author: <i>Paul King</i></span><br/><span>Published: 2022-07-10 02:00PM</span></p><hr/><div id="preamble"> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p><span class="image right"><img src="img/json_logo.gif" alt="json logo" width="120"></span> |
| Groovy has excellent support for processing a range of structured |
| data formats like JSON, TOML, YAML, etc. This blog post looks at |
| <a href="https://www.json.org/json-en.html">JSON</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>There is quite good documentation on this topic as part of the |
| <a href="https://groovy-lang.org/processing-json.html">Groovy documentation</a>. |
| There are also numerous online sources for more details including |
| <a href="https://www.tutorialspoint.com/groovy/groovy_json.htm">Groovy - JSON tutorial</a>, <a href="https://www.baeldung.com/groovy-json">Working with JSON in Groovy</a>, and <a href="https://blog.mrhaki.com/2014/08/groovy-goodness-relax-groovy-will-parse.html">Groovy Goodness: Relax… Groovy Will Parse Your Wicked JSON</a> |
| to name just a few. This post does a quick summary and provides |
| more setup information and details about various options.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_batteries_included_experience">Batteries included experience</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>If you have installed the Groovy installation zip (or .msi on |
| windows), you will have the <code>groovy-json</code> module which |
| includes <code>JsonSlurper</code>, so the bulk of the examples shown here |
| and in the other mentioned links should work out of the box.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>JsonSlurper</code> is the main class for parsing JSON.</p> |
| </div> |
| <div class="paragraph"> |
| <p><span class="image"><img src="img/JsonSlurper_in_GroovyConsole.png" alt="JsonSlurper in GroovyConsole"></span></p> |
| </div> |
| <div class="paragraph"> |
| <p>This example shows parsing JSON embedded in a string but there |
| are other methods for parsing files, URLs and other streams.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Another example using <code>groovysh</code>:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="console">paulk@pop-os:~$ groovysh |
| Groovy Shell (4.0.3, JVM: 18.0.1) |
| Type ':help' or ':h' for help. |
| ---------------------------------------------------------------------------------------- |
| groovy:000> new groovy.json.JsonSlurper().parseText('{ "myList": [1, 3, 5] }').myList |
| ===> [1, 3, 5]</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Or using a Jupyter/BeakerX notebook:</p> |
| </div> |
| <div class="paragraph"> |
| <p><span class="image"><img src="img/JsonSlurper_in_Jupyter_notebook.png" alt="JsonSlurper in Jupyter notebook"></span></p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_gradle">Gradle</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>If you are using a build tool like <a href="https://gradle.org/">Gradle</a>, |
| you may prefer to reference your dependencies from a dependency |
| repository rather than having a locally installed distribution.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Suppose you have the following test using <code>JsonSlurper</code> in |
| the file <code>src/test/groovy/JsonTest.groovy</code>:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="groovy">import groovy.json.JsonSlurper |
| import org.junit.Test |
| |
| class JsonTest { |
| @Test |
| void testJson() { |
| def text = '{"person":{"name":"Guillaume","age":33,"pets":["dog","cat"]}}' |
| def json = new JsonSlurper().parseText(text) |
| assert json.person.pets.size() == 2 |
| } |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>You can reference the relevant Groovy dependencies, in our case |
| <code>groovy-json</code> and <code>groovy-test</code>, in a <code>build.gradle</code> file like |
| below:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="groovy">apply plugin: 'groovy' |
| |
| repositories { |
| mavenCentral() |
| } |
| |
| dependencies { |
| testImplementation "org.apache.groovy:groovy-json:4.0.3" // for JsonSlurper |
| testImplementation "org.apache.groovy:groovy-test:4.0.3" // for tests |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Both these artifacts bring in the core <code>groovy</code> artifact |
| transitively, so there’s no need to reference that explicitly.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Running <code>gradle test</code> should run the tests and produce a report:</p> |
| </div> |
| <div class="paragraph"> |
| <p><span class="image"><img src="img/Test_results_for_Class_JsonTest.png" alt="Test results for Class JsonTest"></span></p> |
| </div> |
| <div class="paragraph"> |
| <p>You can if you prefer, use the <code>groovy-all</code> artifact like this:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="groovy">apply plugin: 'groovy' |
| |
| repositories { |
| mavenCentral() |
| } |
| |
| dependencies { |
| testImplementation "org.apache.groovy:groovy-all:4.0.3" |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>This artifact contains no jars but has all of the common |
| Groovy modules as transitive dependencies.</p> |
| </div> |
| <div class="paragraph"> |
| <p>[<strong>Note</strong>: In early Groovy 4 versions you may have needed to reference Groovy as a platform, e.g.: |
| <code>testImplementation platform("org.apache.groovy:groovy-all:4.0.1")</code>. This is now only required when using the <code>groovy-bom</code> artifact.]</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_maven">Maven</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>When using the <a href="https://maven.apache.org/">Maven</a> build tool, |
| you would instead create a <code>pom.xml</code> like below and make |
| use of two plugins:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="xml"><?xml version="1.0"?> |
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> |
| <modelVersion>4.0.0</modelVersion> |
| <groupId>myGroupId</groupId> |
| <artifactId>groovy-json-maven</artifactId> |
| <version>0.0.1-SNAPSHOT</version> |
| <packaging>jar</packaging> |
| <build> |
| <plugins> |
| <plugin> |
| <groupId>org.codehaus.gmavenplus</groupId> |
| <artifactId>gmavenplus-plugin</artifactId> |
| <version>1.13.0</version> |
| <executions> |
| <execution> |
| <goals> |
| <goal>compileTests</goal> |
| </goals> |
| </execution> |
| </executions> |
| </plugin> |
| <plugin> |
| <groupId>org.apache.maven.plugins</groupId> |
| <artifactId>maven-surefire-plugin</artifactId> |
| <version>3.0.0-M7</version> |
| </plugin> |
| </plugins> |
| </build> |
| <dependencies> |
| <dependency> |
| <groupId>org.apache.groovy</groupId> |
| <artifactId>groovy-json</artifactId> |
| <version>4.0.3</version> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.groovy</groupId> |
| <artifactId>groovy-test</artifactId> |
| <version>4.0.3</version> |
| </dependency> |
| </dependencies> |
| </project></code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Alternatively, you could once again reference the <code>groovy-all</code> |
| artifact as per this alternate build file:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="xml"><?xml version="1.0"?> |
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> |
| <modelVersion>4.0.0</modelVersion> |
| <groupId>myGroupId</groupId> |
| <artifactId>groovy-json-maven</artifactId> |
| <version>0.0.1-SNAPSHOT</version> |
| <packaging>jar</packaging> |
| <build> |
| <plugins> |
| <plugin> |
| <groupId>org.codehaus.gmavenplus</groupId> |
| <artifactId>gmavenplus-plugin</artifactId> |
| <version>1.13.0</version> |
| <executions> |
| <execution> |
| <goals> |
| <goal>compileTests</goal> |
| </goals> |
| </execution> |
| </executions> |
| </plugin> |
| <plugin> |
| <groupId>org.apache.maven.plugins</groupId> |
| <artifactId>maven-surefire-plugin</artifactId> |
| <version>3.0.0-M7</version> |
| <dependencies> |
| <dependency> |
| <groupId>org.apache.maven.surefire</groupId> |
| <artifactId>surefire-junit47</artifactId> |
| <version>3.0.0-M7</version> |
| </dependency> |
| </dependencies> |
| </plugin> |
| </plugins> |
| </build> |
| <dependencies> |
| <dependency> |
| <groupId>org.apache.groovy</groupId> |
| <artifactId>groovy-all</artifactId> |
| <type>pom</type> |
| <version>4.0.3</version> |
| </dependency> |
| </dependencies> |
| </project></code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>When referencing the <code>groovy-all</code> artifact, we specify that it |
| is a pom artifact using <code><type>pom</type></code>. |
| We also needed to configure the surefire plugin to use JUnit4. |
| The <code>groovy-all</code> artifact also brings in JUnit5 support and the |
| surefire plugin will use that by default and not find our test.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Running the test should yield:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>[<span class="blue">INFO</span>] ------------------------------------------------------ |
| [<span class="blue">INFO</span>] T E S T S |
| [<span class="blue">INFO</span>] ------------------------------------------------------ |
| [<span class="blue">INFO</span>] Running JsonTest |
| [<span class="blue">INFO</span>] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.36 s - in JsonTest</pre> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_advanced_features">Advanced features</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>To cater for different scenarios, <code>JsonSlurper</code> is powered by |
| several internal implementation classes. You don’t access these |
| classes directly but rather set a parser <em>type</em> when |
| instantiating your slurper.</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 22.2222%;"> |
| <col style="width: 77.7778%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Type</th> |
| <th class="tableblock halign-left valign-top">When to use</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">CHAR_BUFFER</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Default, least-surprise parser with eager parsing of ints, dates, etc.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">INDEX_OVERLAY</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">For REST calls, WebSocket messages, AJAX, inter process communication. Fastest parser which uses indexes to some existing char buffer.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">CHARACTER_SOURCE</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">For handling larger JSON files.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">LAX</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Allows comments and no quotes or single quotes in numerous situations.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>Here is an example:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="groovy">import groovy.json.JsonSlurper |
| import static groovy.json.JsonParserType.* |
| |
| def slurper = new JsonSlurper(type: LAX) |
| def json = slurper.parseText('''{person:{'name':"Guillaume","age":33,"pets":["dog" /* ,"cat" */]}}''') |
| assert json.person.pets == ['dog']</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Note the missing quotes for the <em>person</em> key, the single quotes |
| for the <em>name</em> key and <em>"cat"</em> has been commented out. |
| These changes wouldn’t be allowed by a strict JSON parser.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_other_json_libraries">Other JSON libraries</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Groovy doesn’t require you to use the <code>groovy-json</code> classes. |
| You can use your favourite Java library with Groovy. |
| You’ll still benefit from many of Groovy’s short-hand notations.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Here’s an example using Gson:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="groovy">@Grab('com.google.code.gson:gson:2.9.0') |
| import com.google.gson.JsonParser |
| |
| def parser = new JsonParser() |
| def json = parser.parse('{"person":{"name":"Guillaume","age":33,"pets":["dog","cat"]}}') |
| assert json.person.pets*.asString == ['dog', 'cat']</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Here’s an example using the Jackson JSON support:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="groovy">@Grab('com.fasterxml.jackson.core:jackson-databind:2.13.3') |
| import com.fasterxml.jackson.databind.ObjectMapper |
| |
| def text = '{"person":{"name":"Guillaume","age":33,"pets":["dog","cat"]}}' |
| def json = new ObjectMapper().readTree(text) |
| assert json.person.pets*.asText() == ['dog', 'cat']</code></pre> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_integrated_query">Integrated query</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Groovy 4 also supports language integrated query syntax, known as |
| GINQ or GQuery. We can use that with JSON too.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Suppose we have information in JSON format about fruits, their |
| prices (per 100g) and the concentration of vitamin C (per 100g):</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="json">{ |
| "prices": [ |
| {"name": "Kakuda plum", "price": 13}, |
| {"name": "Camu camu", "price": 25}, |
| {"name": "Acerola cherries", "price": 39}, |
| {"name": "Guava", "price": 2.5}, |
| {"name": "Kiwifruit", "price": 0.4}, |
| {"name": "Orange", "price": 0.4} |
| ], |
| "vitC": [ |
| {"name": "Kakuda plum", "conc": 5300}, |
| {"name": "Camu camu", "conc": 2800}, |
| {"name": "Acerola cherries", "conc": 1677}, |
| {"name": "Guava", "conc": 228}, |
| {"name": "Kiwifruit", "conc": 144}, |
| {"name": "Orange", "conc": 53} |
| ] |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Now, suppose we are on a budget and want to select the most |
| cost-effective fruits to buy to help us achieve our daily |
| vitamin C requirements. We <em>join</em> the <em>prices</em> and <em>vitC</em> information and order by most cost-effective fruit. |
| We’ll select the top 2 in case our first choice isn’t in stock |
| when we go shopping. Our GQuery processing looks like this:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="groovy">def jsonFile = new File('fruit.json') |
| def json = new JsonSlurper().parse(jsonFile) |
| assert GQL { |
| from p in json.prices |
| join c in json.vitC on c.name == p.name |
| orderby c.conc / p.price in desc |
| limit 2 |
| select p.name |
| } == ['Kakuda plum', 'Kiwifruit']</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>We can see, for this data, Kakadu plums followed by Kiwifruit |
| are our best choices.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_quick_performance_comparison">Quick performance comparison</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>As a very crude measure of performance, <code>JsonSlurper</code> with all 4 parser types as well as Gson and Jackson were used to parse |
| the timezone values from |
| <a href="https://github.com/flowcommerce/json-reference" class="bare">https://github.com/flowcommerce/json-reference</a> and check that |
| the current timezone in Brisbane is the same as the timezone |
| in Sydney. The json file is by no means huge. It has just under |
| 3000 lines and is under 60K in size. The best time taken |
| (including compilation time) after 4 runs was taken - definitely |
| a micro-benchmark which shouldn’t be taken too seriously, but |
| might be a rough guide. Just for fun, a native version of the |
| Groovy JsonSlurper script with the type set to INDEX_OVERLAY |
| was made using GraalVM. It’s timings are included too.</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="prettyprint highlight"><code data-lang="shell">$ time groovy GroovyJsonIndexOverlay.groovy |
| real 0m1.365s |
| user 0m4.157s |
| sys 0m0.145s |
| |
| $ time groovy GroovyJsonCharacterSource.groovy |
| real 0m1.447s |
| user 0m4.472s |
| sys 0m0.174s |
| |
| $ time groovy GroovyJsonLax.groovy |
| real 0m1.452s |
| user 0m4.338s |
| sys 0m0.171s |
| |
| $ time groovy GroovyJson.groovy |
| real 0m1.383s |
| user 0m4.050s |
| sys 0m0.165s |
| |
| $ time groovy Gson.groovy |
| real 0m1.814s |
| user 0m5.543s |
| sys 0m0.209s |
| |
| $ time groovy Jackson.groovy |
| real 0m2.007s |
| user 0m6.332s |
| sys 0m0.208s |
| |
| $ time ./groovyjsonindexoverlay |
| real 0m0.015s |
| user 0m0.011s |
| sys 0m0.004s</code></pre> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_summary">Summary</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>We have seen the basics of setting up our projects to parse JSON |
| using Groovy and some of the numerous options available to use |
| depending on the scenario. We also saw how to use other JSON |
| libraries, utilize GQuery syntax during our processing, and |
| looked at some very crude performance figures.</p> |
| </div> |
| </div> |
| </div></div></div></div></div><footer id='footer'> |
| <div class='row'> |
| <div class='colset-3-footer'> |
| <div class='col-1'> |
| <h1>Groovy</h1><ul> |
| <li><a href='https://groovy-lang.org/learn.html'>Learn</a></li><li><a href='https://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='/download.html'>Download</a></li><li><a href='https://groovy-lang.org/support.html'>Support</a></li><li><a href='/'>Contribute</a></li><li><a href='https://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li><a href='/blog'>Blog posts</a></li><li><a href='https://groovy.apache.org/events.html'></a></li> |
| </ul> |
| </div><div class='col-2'> |
| <h1>About</h1><ul> |
| <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='https://groovy-lang.org/security.html'>Security</a></li><li><a href='https://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='https://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='https://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='https://groovy-lang.org/search.html'>Search</a></li> |
| </ul> |
| </div><div class='col-3'> |
| <h1>Socialize</h1><ul> |
| <li><a href='https://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='https://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='https://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li> |
| </ul> |
| </div><div class='col-right'> |
| <p> |
| The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community. |
| </p><div text-align='right'> |
| <img src='../img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' style='width:60%'/> |
| </div><p>Apache® and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation.</p> |
| </div> |
| </div><div class='clearfix'>© 2003-2023 the Apache Groovy project — Groovy is Open Source: <a href='http://www.apache.org/licenses/LICENSE-2.0.html' alt='Apache 2 License'>license</a>, <a href='https://privacy.apache.org/policies/privacy-policy-public.html'>privacy policy</a>.</div> |
| </div> |
| </footer></div> |
| </div> |
| </div> |
| </div> |
| </div><script src='../js/vendor/jquery-1.10.2.min.js' defer></script><script src='../js/vendor/classie.js' defer></script><script src='../js/vendor/bootstrap.js' defer></script><script src='../js/vendor/sidebarEffects.js' defer></script><script src='../js/vendor/modernizr-2.6.2.min.js' defer></script><script src='../js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script> |
| (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ |
| (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), |
| m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) |
| })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); |
| |
| ga('create', 'UA-257558-10', 'auto'); |
| ga('send', 'pageview'); |
| </script> |
| </body></html> |