{"id":3128,"date":"2015-04-10T12:15:24","date_gmt":"2015-04-10T09:15:24","guid":{"rendered":"http:\/\/www.webcodegeeks.com\/?p=3128"},"modified":"2015-04-06T03:38:49","modified_gmt":"2015-04-06T00:38:49","slug":"declarative-beats-imperative-transforming-data-javascript","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/","title":{"rendered":"Declarative Beats Imperative: Transforming Data In JavaScript"},"content":{"rendered":"<p>The product I am working on is a fairly typical web application, based on React.js and Node.js. Its main task is to fetch data from different REST-ish services, combine them, and present them in an attractive manner to users.<\/p>\n<p>This data extraction and transformation \u2013 keeping only the items and properties we care about and structuring them in a way well aligned with the needs of the UI \u2013 is thus crucial. I would like to share our journey from an imperative implementation of this process to a much more reader-friendly declarative one.<\/p>\n<p>For example, here is some JSON data we get back from a REST service:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">&#x5B;{\r\n    productId: '42',\r\n    type: 'TEAPOT',\r\n    subProducts: &#x5B;{\r\n        productNumber: 'ch132',\r\n        name: 'Kyusu Teapot',\r\n        dealerDetails: &#x5B;\r\n          { dealerGroup: 'webshop', rank: 1 }\r\n        ]}]}];<\/pre>\n<p>And here is what we would like to transform it into:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">{\r\n  '42': {\r\n    'productId': '42',\r\n    'variations': {\r\n      'ch132': {\r\n        'productNumber': 'ch132',\r\n        'name': 'Kyusu Teapot',\r\n      }\r\n    },\r\n    'selectedSubProductId': 'ch132'\r\n  }}<\/pre>\n<p>My first implementation was functional, using the wonderful functional library <a href=\"https:\/\/lodash.com\/\">lodash<\/a>, but rather imperative. We had a series of functions that transformed some vague JavaScript object \/ JSON into something else. It looked something like this:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">_.chain(data)\r\n\t.groupBy('productId')\r\n\t.mapValues(_.flow(_.first, transformProduct))\r\n\t.value();\r\n\r\nfunction transformProduct(product) {\r\n    return {\r\n        productId: product.productId,\r\n        variations: _.chain(product.subProducts)\r\n            .groupBy('productNumber')\r\n            .mapValues(_.flow(_.first, transformSubProduct)) \/\/ transformSubProduct not shown\r\n            .value();\r\n    };\r\n}\r\n\/\/ + more stuff left out<\/pre>\n<p>The problem was that it was difficult to see the structure of both the input data and transformed output data.\u00a0Without a good knowledge of the structure of the data being processed and the desired outcome, it was difficult to understand the code. It was also difficult to add additional processing, such as the generation of a \u201ctransformation audit log,\u201d to the process.<\/p>\n<p>Then a smart colleague of mine, Alex York, did a part of the transformation in a nice, declarative way. Inspired, I reimplemented the whole thing to be much more declarative. The core is a nested data structure resembling closely the desired output data with the addition of processing instructions. Here is a simplified example:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">var productCatalogTransformationDefinition = {\r\n    type: 'map',\r\n    singleGroupBy: 'productId',\r\n    elementValue: {\r\n        productId: 'productId',\r\n        variations: {\r\n            selector: 'subProducts',\r\n            singleGroupBy: 'productNumber',\r\n            elementValue: {\r\n                productNumber: 'productNumber',\r\n                name: 'name',\r\n                images: {\r\n                    selector: 'additionalDetailsList',\r\n                    filter: function(it) { return it.name.search(\/^IMAGE\\d+$\/) === 0; },\r\n                    elementValue: 'value'\r\n                }\r\n            }\r\n        }\r\n\/\/ + function transform(rawData, transformationDefinition) - see\r\n\/\/   the source code linked below<\/pre>\n<p>As you can see, each output value is specified by an object that defines what operations (based on lodash) to perform on the current \u201csourceElement\u201d to produce it. It is our\u00a0<code>transformer<\/code> module which uses this \u201ctransformDefinition\u201d along with the JSON input data (typically from a REST service) which performs the task of turning the input data into the desired output data structure.<\/p>\n<h2>Pros &amp; Cons<\/h2>\n<p>Pros:<\/p>\n<ul>\n<li>Explicit output data form =&gt; easier to understand code<\/li>\n<li>Declarative processing enables us to add additional functionality to it such as audit log<\/li>\n<\/ul>\n<p>Cons:<\/p>\n<ul>\n<li>The code is longer (but the difference gets smaller as we do more or more complex transformations)<\/li>\n<li>The declarative transformations are much less flexible than\u00a0manual transform code (but good for what we need); for example currently it only supports transforming all elements of a collection in the same way and not e.g. based on their type. (Though we could introduce some kind of an \u201cunionElement\u201d for that.)<\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>The declarative transformation is much easier to understand. It is also fairly easy to add additional functionality, e.g. to log the data subset being processed at a particular stage when troubleshooting or to create an audit log of the processing so that missing or bad output data can easily be traced to the cause.<\/p>\n<p>There is of course much less freedom in what can be done in the context of a transformDefinition than if it was\u00a0manual transform code but it worked well for us and, after all, it is quite easy to extend the format.<\/p>\n<p>An unresolved issue is that the form of the input data is still only implicit. That could be mitigated by describing it with JSON Schema <a href=\"http:\/\/json-schema.org\/\" rel=\"nofollow\">http:\/\/json-schema.org\/<\/a> but having examples of the full input data in our tests is so far sufficient for us.<\/p>\n<p>I would like to thank Alex York for his valuable feedback.<\/p>\n<h2>References<\/h2>\n<p>I found surprisingly little resources dealing with declarative data transformation either on the theoretical or practical level (any pointers are highly welcomed!). I know about XSLT and how some Extract-Transform-Load (ETL) tools work but there certainly must be a theoretical body of knowledge behind this.<\/p>\n<p>Regarding JavaScript\/JSON in particular, <a href=\"http:\/\/www.jsoniq.org\/\">JSONiq<\/a> \u2013 \u201cthe JSON query language,\u201d a transformation-oriented superset of JSON (<a href=\"http:\/\/www.jsoniq.org\/docs\/JSONiq-usecases\/html-single\/\">examples<\/a>) is very interesting. Brett Zamir has a proof of concept for <a href=\"https:\/\/gist.github.com\/brettz9\/0e661b3093764f496e36\">XSL-like JavaScript class<\/a> to transform HTML. Lastly there is the <a href=\"https:\/\/www.npmjs.com\/package\/jsonpath-object-transform\">jsonpath-object-transform<\/a> package that \u201cpulls data from an object literal using JSONPath and generate a new objects based on a template\u201d \u2013 this is most similar to my solution, only based on JSONPath rather than lodash functions.<\/p>\n<h2>Source code<\/h2>\n<p>See <a href=\"https:\/\/github.com\/jakubholynet\/blog\/tree\/master\/miniprojects\/declarative-transformation-js\" rel=\"nofollow\">https:\/\/github.com\/jakubholynet\/blog\/tree\/master\/miniprojects\/declarative-transformation-js<\/a><\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/wondersofcode.wordpress.com\/2015\/03\/13\/declarative-beats-imperative-transforming-data-in-javascript\/\">Declarative Beats Imperative: Transforming Data In JavaScript<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/wcg\/\">WCG partner<\/a> Jakub Holy at the <a href=\"https:\/\/wondersofcode.wordpress.com\/\">Wonders of Code<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>The product I am working on is a fairly typical web application, based on React.js and Node.js. Its main task is to fetch data from different REST-ish services, combine them, and present them in an attractive manner to users. This data extraction and transformation \u2013 keeping only the items and properties we care about and &hellip;<\/p>\n","protected":false},"author":52,"featured_media":921,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[40],"class_list":["post-3128","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-json"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Declarative Beats Imperative: Transforming Data In JavaScript - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"The product I am working on is a fairly typical web application, based on React.js and Node.js. Its main task is to fetch data from different REST-ish\" \/>\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.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Declarative Beats Imperative: Transforming Data In JavaScript - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"The product I am working on is a fairly typical web application, based on React.js and Node.js. Its main task is to fetch data from different REST-ish\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2015-04-10T09:15:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/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=\"Jakub Holy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jakub Holy\" \/>\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.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/\"},\"author\":{\"name\":\"Jakub Holy\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/cd17219b62f558dd5c3509307f22a378\"},\"headline\":\"Declarative Beats Imperative: Transforming Data In JavaScript\",\"datePublished\":\"2015-04-10T09:15:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/\"},\"wordCount\":849,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg\",\"keywords\":[\"JSON\"],\"articleSection\":[\"JavaScript\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/\",\"name\":\"Declarative Beats Imperative: Transforming Data In JavaScript - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg\",\"datePublished\":\"2015-04-10T09:15:24+00:00\",\"description\":\"The product I am working on is a fairly typical web application, based on React.js and Node.js. Its main task is to fetch data from different REST-ish\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/javascript\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Declarative Beats Imperative: Transforming Data In JavaScript\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/cd17219b62f558dd5c3509307f22a378\",\"name\":\"Jakub Holy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7ee9569bd027b442ce03e2cc44cbc8791448ab502e0e2c70cbc6186f64d6e1f5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7ee9569bd027b442ce03e2cc44cbc8791448ab502e0e2c70cbc6186f64d6e1f5?s=96&d=mm&r=g\",\"caption\":\"Jakub Holy\"},\"description\":\"Jakub is an experienced Java[EE] developer working for a lean &amp; agile consultancy in Norway. He is interested in code quality, developer productivity, testing, and in how to make projects succeed.\",\"sameAs\":[\"http:\/\/theholyjava.wordpress.com\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/jakub-holy\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Declarative Beats Imperative: Transforming Data In JavaScript - Web Code Geeks - 2026","description":"The product I am working on is a fairly typical web application, based on React.js and Node.js. Its main task is to fetch data from different REST-ish","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.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/","og_locale":"en_US","og_type":"article","og_title":"Declarative Beats Imperative: Transforming Data In JavaScript - Web Code Geeks - 2026","og_description":"The product I am working on is a fairly typical web application, based on React.js and Node.js. Its main task is to fetch data from different REST-ish","og_url":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2015-04-10T09:15:24+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg","type":"image\/jpeg"}],"author":"Jakub Holy","twitter_card":"summary_large_image","twitter_creator":"@webcodegeeks","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Jakub Holy","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/"},"author":{"name":"Jakub Holy","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/cd17219b62f558dd5c3509307f22a378"},"headline":"Declarative Beats Imperative: Transforming Data In JavaScript","datePublished":"2015-04-10T09:15:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/"},"wordCount":849,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg","keywords":["JSON"],"articleSection":["JavaScript"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/","url":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/","name":"Declarative Beats Imperative: Transforming Data In JavaScript - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg","datePublished":"2015-04-10T09:15:24+00:00","description":"The product I am working on is a fairly typical web application, based on React.js and Node.js. Its main task is to fetch data from different REST-ish","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/json-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/javascript\/declarative-beats-imperative-transforming-data-javascript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"JavaScript","item":"https:\/\/www.webcodegeeks.com\/category\/javascript\/"},{"@type":"ListItem","position":3,"name":"Declarative Beats Imperative: Transforming Data In JavaScript"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/cd17219b62f558dd5c3509307f22a378","name":"Jakub Holy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7ee9569bd027b442ce03e2cc44cbc8791448ab502e0e2c70cbc6186f64d6e1f5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7ee9569bd027b442ce03e2cc44cbc8791448ab502e0e2c70cbc6186f64d6e1f5?s=96&d=mm&r=g","caption":"Jakub Holy"},"description":"Jakub is an experienced Java[EE] developer working for a lean &amp; agile consultancy in Norway. He is interested in code quality, developer productivity, testing, and in how to make projects succeed.","sameAs":["http:\/\/theholyjava.wordpress.com"],"url":"https:\/\/www.webcodegeeks.com\/author\/jakub-holy\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/3128","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=3128"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/3128\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/921"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=3128"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=3128"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=3128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}