{"id":1037,"date":"2012-03-05T12:48:00","date_gmt":"2012-03-05T12:48:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/groovy-1-8-0-meet-jsonbuilder.html"},"modified":"2012-10-21T23:21:02","modified_gmt":"2012-10-21T23:21:02","slug":"groovy-180-meet-jsonbuilder","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html","title":{"rendered":"Groovy 1.8.0 &#8211; meet JsonBuilder!"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\"><a href=\"http:\/\/docs.codehaus.org\/display\/GROOVY\/Groovy+1.8+release+notes\">Groovy 1.8.0<\/a> released in April brought a lot of new features to the language, one of them is <a href=\"http:\/\/docs.codehaus.org\/display\/GROOVY\/Groovy+1.8+release+notes#Groovy1.8releasenotes-NativeJSONsupport\">native JSON support<\/a> through <a href=\"http:\/\/groovy.codehaus.org\/gapi\/groovy\/json\/JsonSlurper.html\">JsonSlurper <\/a>for reading JSON and <a href=\"http:\/\/groovy.codehaus.org\/gapi\/groovy\/json\/JsonBuilder.html\">JsonBuilder <\/a>for writing JSON.<\/p>\n<p>I recently used <strong>JsonBuilder<\/strong> in one of my projects and initially experienced some difficulties in understanding how it operates. My assumption was that <strong>JsonBuilder <\/strong>works similarly to <a href=\"http:\/\/groovy.codehaus.org\/Creating+XML+using+Groovy%27s+MarkupBuilder\">MarkupBuilder <\/a>but as I have quickly found out, it really doesn\u2019t.<\/p>\n<p>Let\u2019s take a simple example. Assume we have a class Message that we would like to serialize to XML markup and JSON.<\/p>\n<pre class=\"brush:java\">@groovy.transform.Canonical\r\nclass Message {\r\n    long   id\r\n    String sender\r\n    String text\r\n}\r\n \r\nassert 'Message(23, me, some text)' ==\r\n       new Message( 23, 'me', 'some text' ).toString()\r\n<\/pre>\n<p>Here I used Groovy 1.8.0 <a href=\"http:\/\/docs.codehaus.org\/display\/GROOVY\/Groovy+1.8+release+notes#Groovy1.8releasenotes-@Canonical\">@Canonical<\/a> annotation providing automatic <a href=\"http:\/\/docs.codehaus.org\/display\/GROOVY\/Groovy+1.8+release+notes#Groovy1.8releasenotes-@ToString\">toString()<\/a>, <a href=\"http:\/\/docs.codehaus.org\/display\/GROOVY\/Groovy+1.8+release+notes#Groovy1.8releasenotes-@EqualsAndHashCode\">equals() and hashCode()<\/a> and a <a href=\"http:\/\/docs.codehaus.org\/display\/GROOVY\/Groovy+1.8+release+notes#Groovy1.8releasenotes-@TupleConstructor\">tuple (ordered) constructor<\/a>.<\/p>\n<p>Let\u2019s serialize a number of messages to XML.<\/p>\n<pre class=\"brush:java\">def messages = [ new Message( 23, 'me', 'some text'       ),\r\n                 new Message( 24, 'me', 'some other text' ),\r\n                 new Message( 25, 'me', 'same text'       )]\r\n \r\ndef writer = new StringWriter()\r\ndef xml    = new groovy.xml.MarkupBuilder( writer )\r\n \r\nxml.messages() {\r\n    messages.each { Message m -&gt; message( id     : m.id,\r\n                                          sender : m.sender,\r\n                                          text   : m.text )}\r\n}\r\n \r\nassert writer.toString() == \"\"\"\r\n&lt;messages&gt;\r\n  &lt;message id='23' sender='me' text='some text' \/&gt;\r\n  &lt;message id='24' sender='me' text='some other text' \/&gt;\r\n  &lt;message id='25' sender='me' text='same text' \/&gt;\r\n&lt;\/messages&gt;\"\"\".trim()\r\n<\/pre>\n<p>Well, that was pretty straightforward. Let\u2019s try to do the same with JSON.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\"brush:java\">def json = new groovy.json.JsonBuilder()\r\n \r\njson.messages() {\r\n    messages.each { Message m -&gt; message( id     : m.id,\r\n                                          sender : m.sender,\r\n                                          text   : m.text )}\r\n}\r\n \r\nassert json.toString() ==\r\n       '{\"messages\":{\"message\":{\"id\":25,\"sender\":\"me\",\"text\":\"same text\"}}}'\r\n<\/pre>\n<p>Wow, where did all other messages go? Why only one last message in the list was serialized?<br \/>\nHow about this:<\/p>\n<pre class=\"brush:java\">json = new groovy.json.JsonBuilder()\r\n \r\njson.messages() {\r\n    message {\r\n        id     23\r\n        sender 'me'\r\n        text   'some text'\r\n    }\r\n    message {\r\n        id     24\r\n        sender 'me'\r\n        text   'some other text'\r\n    }\r\n}\r\n \r\nassert json.toString() ==\r\n       '{\"messages\":{\"message\":{\"id\":24,\"sender\":\"me\",\"text\":\"some other text\"}}}'\r\n<\/pre>\n<p>Same story. Initially I was puzzled, but then <strong>JsonBuilder <\/strong><a href=\"https:\/\/fisheye.codehaus.org\/browse\/groovy\/tags\/GROOVY_1_8_0\/src\/main\/groovy\/json\/JsonBuilder.groovy?hb=true\">source code<\/a> showed that every invocation overrides the previous content:<\/p>\n<pre class=\"brush:java\">JsonBuilder(content = null) {\r\n    this.content = content\r\n}\r\n \r\ndef call(Map m) {\r\n    this.content = m\r\n    return content\r\n}\r\n \r\ndef call(List l) {\r\n    this.content = l\r\n    return content\r\n}\r\n \r\ndef call(Object... args) {\r\n    this.content = args.toList()\r\n    return this.content\r\n}\r\n \r\ndef call(Closure c) {\r\n    this.content = JsonDelegate.cloneDelegateAndGetContent(c)\r\n    return content\r\n}\r\n<\/pre>\n<p>As you see, one should invoke <strong>JsonBuilder <\/strong>exactly once, passing it a <strong>Map<\/strong>, <strong>List<\/strong>, varargs or <strong>Closure<\/strong>. This makes <strong>JsonBuilder <\/strong>very different from <strong>MarkupBuilder <\/strong>which can be updated as many times as needed. It could be caused by the JSON itself, whose format is stricter than free-form XML markup: something that started as a JSON map with a single <strong>Message<\/strong>, can not be made into array of <strong>Messages <\/strong>out of sudden.<\/p>\n<p>The argument passed to <strong>JsonBuilder <\/strong>(Map, List, varargs or Closure) can also be specified in constructor so there\u2019s no need to invoke a builder at all. You can simply initialize it with the corresponding data structure and call <strong>toString()<\/strong> right away. Let\u2019s try this!<\/p>\n<pre class=\"brush:java\">def listOfMaps = messages.collect{\r\n                 Message m -&gt; [ id     : m.id,\r\n                                sender : m.sender,\r\n                                text   : m.text ]}\r\n \r\nassert new groovy.json.JsonBuilder( listOfMaps ).toString() ==\r\n       '''[{\"id\":23,\"sender\":\"me\",\"text\":\"some text\"},\r\n           {\"id\":24,\"sender\":\"me\",\"text\":\"some other text\"},\r\n           {\"id\":25,\"sender\":\"me\",\"text\":\"same text\"}]'''.\r\n       readLines()*.trim().join()\r\n<\/pre>\n<p>Now it works :) After converting the list of messages to the list of Maps and sending them to the JsonBuilder in one go, the String generated contains all messages from the list. All code above is available in <a href=\"http:\/\/groovyconsole.appspot.com\/script\/498001\">Groovy web console<\/a> so you are welcome to try it out.<\/p>\n<p>Btw, for viewing JSON online I recommend an excellent \u201c<a href=\"http:\/\/chris.photobooks.com\/json\/default.htm\">JSON Visualization<\/a>\u201d application made by Chris Nielsen. \u201c<a href=\"http:\/\/jsonviewer.stack.hu\/\">Online JSON Viewer<\/a>\u201d is another popular option, but I much prefer the first one. And for offline use \u201c<a href=\"http:\/\/jsonviewer.codeplex.com\/\">JSON Viewer<\/a>\u201d makes a good <a href=\"http:\/\/www.fiddler2.com\/fiddler2\/\">Fiddler <\/a>plugin.<\/p>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"http:\/\/3.bp.blogspot.com\/-dVjOhhDkIzk\/T1ImJCOJ2-I\/AAAAAAAAAfA\/67CsFFVXHmc\/s1600\/JSON-Visualization2.png\"><img decoding=\"async\" border=\"0\" src=\"http:\/\/3.bp.blogspot.com\/-dVjOhhDkIzk\/T1ImJCOJ2-I\/AAAAAAAAAfA\/67CsFFVXHmc\/s1600\/JSON-Visualization2.png\" \/><\/a><\/div>\n<p>P.S.<br \/>\nIf you need to read this JSON on the client side by sending, say, Ajax GET request, this can be easily done with <a href=\"http:\/\/api.jquery.com\/jQuery.get\/\">jQuery.get()<\/a>:<\/p>\n<pre class=\"brush:bash\">&lt;script type=\"text\/javascript\"&gt;\r\nvar j = jQuery;\r\n \r\nj( function() {\r\n    j.get( 'url',\r\n           { timestamp: new Date().getTime() },\r\n           function ( messages ){\r\n               j.each( messages, function( index, m ) {\r\n                   alert( \"[\" + m.id + \"][\" + m.sender + \"][\" + m.text + \"]\" );\r\n               });\r\n           },\r\n           'json'\r\n        );\r\n});\r\n&lt;\/script&gt;\r\n<\/pre>\n<p>Here I use a neat trick of a <strong>j<\/strong> shortcut to avoid typing <strong>jQuery <\/strong>too many times when using <strong>$<\/strong> is not an option.<\/p>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/evgeny-goldin.com\/blog\/groovy-jsonbuilder\/\">Groovy 1.8.0 \u2013 meet JsonBuilder!<\/a>&nbsp;from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a><span class=\"Apple-style-span\" style=\"font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif\"><span class=\"Apple-style-span\" style=\"font-size: 14px;line-height: 18px\"><strong>&nbsp;<\/strong><\/span><\/span>Evgeny Goldin at the&nbsp;<a href=\"http:\/\/evgeny-goldin.com\/blog\/\">Goldin++<\/a>&nbsp;blog. <\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Groovy 1.8.0 released in April brought a lot of new features to the language, one of them is native JSON support through JsonSlurper for reading JSON and JsonBuilder for writing JSON. I recently used JsonBuilder in one of my projects and initially experienced some difficulties in understanding how it operates. My assumption was that JsonBuilder &hellip;<\/p>\n","protected":false},"author":169,"featured_media":175,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[69],"class_list":["post-1037","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-groovy","tag-json"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Groovy 1.8.0 - meet JsonBuilder! - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Groovy 1.8.0 released in April brought a lot of new features to the language, one of them is native JSON support through JsonSlurper for reading JSON and\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Groovy 1.8.0 - meet JsonBuilder! - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Groovy 1.8.0 released in April brought a lot of new features to the language, one of them is native JSON support through JsonSlurper for reading JSON and\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2012-03-05T12:48:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-21T23:21:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/json-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Evgeny Goldin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Evgeny Goldin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html\"},\"author\":{\"name\":\"Evgeny Goldin\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/8f524cd5717e447dee7c0b3233878384\"},\"headline\":\"Groovy 1.8.0 &#8211; meet JsonBuilder!\",\"datePublished\":\"2012-03-05T12:48:00+00:00\",\"dateModified\":\"2012-10-21T23:21:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html\"},\"wordCount\":450,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/json-logo.jpg\",\"keywords\":[\"JSON\"],\"articleSection\":[\"Groovy\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html\",\"name\":\"Groovy 1.8.0 - meet JsonBuilder! - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/json-logo.jpg\",\"datePublished\":\"2012-03-05T12:48:00+00:00\",\"dateModified\":\"2012-10-21T23:21:02+00:00\",\"description\":\"Groovy 1.8.0 released in April brought a lot of new features to the language, one of them is native JSON support through JsonSlurper for reading JSON and\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/json-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/json-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/03\\\/groovy-180-meet-jsonbuilder.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JVM Languages\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/jvm-languages\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Groovy\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/jvm-languages\\\/groovy\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Groovy 1.8.0 &#8211; meet JsonBuilder!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/8f524cd5717e447dee7c0b3233878384\",\"name\":\"Evgeny Goldin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1bf730cd7e316c1a4698b41d194dd19eb1abbc7a693f424e78159cf8cfdcc2df?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1bf730cd7e316c1a4698b41d194dd19eb1abbc7a693f424e78159cf8cfdcc2df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1bf730cd7e316c1a4698b41d194dd19eb1abbc7a693f424e78159cf8cfdcc2df?s=96&d=mm&r=g\",\"caption\":\"Evgeny Goldin\"},\"sameAs\":[\"http:\\\/\\\/evgeny-goldin.com\\\/blog\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Evgeny-Goldin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Groovy 1.8.0 - meet JsonBuilder! - Java Code Geeks","description":"Groovy 1.8.0 released in April brought a lot of new features to the language, one of them is native JSON support through JsonSlurper for reading JSON and","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html","og_locale":"en_US","og_type":"article","og_title":"Groovy 1.8.0 - meet JsonBuilder! - Java Code Geeks","og_description":"Groovy 1.8.0 released in April brought a lot of new features to the language, one of them is native JSON support through JsonSlurper for reading JSON and","og_url":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2012-03-05T12:48:00+00:00","article_modified_time":"2012-10-21T23:21:02+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/json-logo.jpg","type":"image\/jpeg"}],"author":"Evgeny Goldin","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Evgeny Goldin","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html"},"author":{"name":"Evgeny Goldin","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/8f524cd5717e447dee7c0b3233878384"},"headline":"Groovy 1.8.0 &#8211; meet JsonBuilder!","datePublished":"2012-03-05T12:48:00+00:00","dateModified":"2012-10-21T23:21:02+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html"},"wordCount":450,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/json-logo.jpg","keywords":["JSON"],"articleSection":["Groovy"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html","url":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html","name":"Groovy 1.8.0 - meet JsonBuilder! - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/json-logo.jpg","datePublished":"2012-03-05T12:48:00+00:00","dateModified":"2012-10-21T23:21:02+00:00","description":"Groovy 1.8.0 released in April brought a lot of new features to the language, one of them is native JSON support through JsonSlurper for reading JSON and","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/json-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/json-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2012\/03\/groovy-180-meet-jsonbuilder.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"JVM Languages","item":"https:\/\/www.javacodegeeks.com\/category\/jvm-languages"},{"@type":"ListItem","position":3,"name":"Groovy","item":"https:\/\/www.javacodegeeks.com\/category\/jvm-languages\/groovy"},{"@type":"ListItem","position":4,"name":"Groovy 1.8.0 &#8211; meet JsonBuilder!"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/8f524cd5717e447dee7c0b3233878384","name":"Evgeny Goldin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/1bf730cd7e316c1a4698b41d194dd19eb1abbc7a693f424e78159cf8cfdcc2df?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1bf730cd7e316c1a4698b41d194dd19eb1abbc7a693f424e78159cf8cfdcc2df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1bf730cd7e316c1a4698b41d194dd19eb1abbc7a693f424e78159cf8cfdcc2df?s=96&d=mm&r=g","caption":"Evgeny Goldin"},"sameAs":["http:\/\/evgeny-goldin.com\/blog\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Evgeny-Goldin"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/169"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=1037"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1037\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/175"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=1037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=1037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=1037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}