{"id":67,"date":"2008-09-02T09:12:26","date_gmt":"2008-09-02T12:12:26","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=67"},"modified":"2008-09-08T00:28:21","modified_gmt":"2008-09-08T03:28:21","slug":"parseando-xml-com-groovy-ou-como-causar-inveja-em-um-programador-java-e-depois-satisfaze-la","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=67","title":{"rendered":"Lendo XML com Groovy (ou como causar inveja em um programador Java (e depois satisfaz\u00ea-la!)) &#8211; (ou ainda, como ler XML SEMPRE deveria ter sido)"},"content":{"rendered":"<p>Sempre achei XML paradoxal. Por um lado, trata-se de uma tecnologia fant\u00e1stica: a sintaxe do XML \u00e9 simpl\u00edssima. Qualquer um consegue gerar um documento no formato XML. No entanto, em contrapartida, ler o bem dito documento (ao menos em Java) pode ser um supl\u00edcio.<\/p>\n<p>H\u00e1 ferramentas que facilitam este trabalho (Dom4J, XStreamer, etc.), mas \u00e9 uma pena que, na pr\u00f3pria linguagem, nativamente, tais recursos n\u00e3o existam (\u00e9 compreens\u00edvel, mas \u00e9 chato). Sendo assim, gostaria de incluir mais uma ferramenta para facilitar a vida do desenvolvedor Java: Groovy! Neste post (que pode ser considerado uma continua\u00e7\u00e3o do anterior), irei mostrar como se parseia um documento XML usando Groovy em, em seguida, como integrar este parser em seu c\u00f3digo Java (satisfa\u00e7o assim a sua inveja).<\/p>\n<p>Para come\u00e7ar, iniciemos com o documento XML que iremos parsear:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n&lt;?xml encoding=&quot;ISO-8859-1&quot; version=&quot;1.0&quot;?&gt;\r\n&lt;enderecos&gt;\r\n    &lt;endereco id=&quot;1&quot;&gt;\r\n        &lt;rua&gt;Para\u00edba&lt;\/rua&gt;\r\n        &lt;numero&gt;1061&lt;\/numero&gt;\r\n        &lt;bairro&gt;Savassi&lt;\/bairro&gt;\r\n        &lt;cidade&gt;Belo Horizonte&lt;\/cidade&gt;\r\n    &lt;\/endereco&gt;\r\n    &lt;endereco id=&quot;2&quot;&gt;\r\n        &lt;rua&gt;Av. Afonso Pena&lt;\/rua&gt;\r\n        &lt;numero&gt;4114&lt;\/numero&gt;\r\n        &lt;bairro&gt;Cruzeiro&lt;\/bairro&gt;\r\n        &lt;cidade&gt;Belo Horizonte&lt;\/cidade&gt;\r\n    &lt;\/endereco&gt;\r\n&lt;\/enderecos&gt;\r\n<\/pre>\n<p>E, o c\u00f3digo feito em Groovy para parsear este XML \u00e9&#8230;<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\ndef registros = new XmlParser().parseText(str)\r\ndef enderecos = registros.endereco.size()\r\nfor (int i = 0; i &lt; registros.endereco.size(); i++) {\r\n    print &quot;\\n${registros.endereco&amp;#91;i&amp;#93;.&#039;@id&#039;}&quot;\r\n    print &quot;\\n\\t${registros.endereco&amp;#91;i&amp;#93;.rua.text()}&quot;\r\n    print &quot;\\n\\t${registros.endereco&amp;#91;i&amp;#93;.numero.text()}&quot;\r\n    print &quot;\\n\\t${registros.endereco&amp;#91;i&amp;#93;.bairro.text()}&quot;\r\n    print &quot;\\n\\t${registros.endereco&amp;#91;i&amp;#93;.cidade.text()}&quot;\r\n}\r\n&amp;#91;\/code&amp;#93;\r\nAgora, vamos comentar este c\u00f3digo linha a linha: primeiro, iremos comentar a &lt;i&gt;n\u00e3o linha&lt;\/i&gt; deste c\u00f3digo. Repare que n\u00e3o h\u00e1 instru\u00e7\u00e3o alguma de importa\u00e7\u00e3o de classes ou pacotes. Isto porque a classe XmlParser se trata de um recurso nativo da linguagem.\r\n\r\n&#x5B;code language=&#039;java&#039;]def registros = new XmlParser().parseText(str)<\/pre>\n<p>\u00c9 declarada aqui uma vari\u00e1vel chamada registros, que \u00e9 o resultado da fun\u00e7\u00e3o parseText do objeto XmlParser, que acabamos de instanciar. Este m\u00e9todo recebe como par\u00e2metro apenas uma string (no caso, imaginemos que exista uma vari\u00e1vel chamada str em nosso c\u00f3digo fonte, que contenha o XML descrito acima). <i>registros<\/i> consiste em uma Collection, que armazena objetos cujos m\u00e9todos e atributos ser\u00e3o definidos de acordo com o conte\u00fado do XML parseado.<\/p>\n<p><span style=\"background-color: #dedede\"><br \/>\n<b>(<\/b><br \/>\nJ\u00e1 se perguntou pra que serve este lance de ficar incluindo m\u00e9todos e atributos em uma classe em tempo de execu\u00e7\u00e3o? Eis aqui um bom exemplo.<br \/>\nO objeto retornado pelo Parser possuir\u00e1 m\u00e9todos e atributos definidos de acordo com o XML parseado! Veja o c\u00f3digo abaixo:<br \/>\n<br \/><b>)<\/b><br \/>\n<\/span><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">def enderecos = registros.endereco.size()<\/pre>\n<p>O objeto enderecos representa o elemento raiz do XML lido. Como o XML lido possui mais de um elemento <i>endereco<\/i>, Groovy o trata como uma cole\u00e7\u00e3o. Ent\u00e3o, chama-se o m\u00e9todo size desta cole\u00e7\u00e3o para se saber quantos endere\u00e7os est\u00e3o armazenados na estrutura registros.<\/p>\n<p>Dentro do loop, fica ainda mais n\u00edtido como acessar estes valores a partir do XML:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">print &quot;\\n${registros.endereco&#x5B;i].&#039;@id&#039;}&quot;<\/pre>\n<p>Em cada objeto do tipo endereco (criado din\u00e2micamente por Groovy), imprimo o atributo id do mesmo. Fa\u00e7o isto usando o operador <i>@id<\/i>.<\/p>\n<p>O operador @[nome do atributo] consiste em um construtor do Groovy que nos permite acessar diretamente um atributo de determinado objeto. Groovy criou um atributo chamado id na classe endereco. Sacou? id era um atributo do elemento endereco no XML. Logo, vira um <b>atributo<\/b> da classe endereco criada din\u00e2micamente!<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">print &quot;\\n\\t${registros.endereco&#x5B;i].rua.text()}&quot;<\/pre>\n<p>Aqui, percebe-se que foi criado um objeto chamado <i>rua<\/i> dentro da estrutura do objeto <i>endereco<\/i>. Como trata-se de um elemento XML, Groovy o transforma em outro objeto! Para saber o seu conte\u00fado, simplesmente chamo a fun\u00e7\u00e3o text() deste objeto criado. <\/p>\n<p>Como pode-se observar (n\u00e3o vou ficar repetindo as \u00faltimas linhas do c\u00f3digo), o modo como o Groovy parseia o XML \u00e9 muito simples. \u00c9 criado um c\u00f3digo muito mais f\u00e1cil de entender do que aquele que estamos acostumados a trabalhar com Java (ou C#). Nada de NodeLists, Elements, etc. Os elementos do XML recebem nomes que correspondem aquilo representado no documento. Seu cliente poderia ler este c\u00f3digo e compreend\u00ea-lo sem problemas (pense nisto).<\/p>\n<p>Ent\u00e3o, agora que criei inveja em programadores que trabalhem com Java, vou sacia-la. C\u00f3digo Groovy \u00e9 100% integrado ao c\u00f3digo Java. Um chama o outro sem a menor dificuldade. Sendo assim, segue abaixo uma classe, escrita em Java, que exp\u00f5e como integrar seu c\u00f3digo Java com Groovy :)<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nimport java.io.IOException;\r\nimport java.util.List;\r\n\r\nimport groovy.lang.Binding;\r\nimport groovy.lang.GroovyShell;\r\nimport groovy.lang.Script;\r\nimport java.io.BufferedReader;\r\nimport java.io.InputStream;\r\nimport java.io.InputStreamReader;\r\n\r\n\r\npublic class EnderecoParser {\r\n    \r\n    \/\/ GroovyShell \u00e9 a classe respons\u00e1vel por executar c\u00f3digo Groovy\r\n    private static GroovyShell shell;\r\n    \/\/ Binding passa par\u00e2metros ao seu c\u00f3digo Groovy\r\n    private static Binding binding = new Binding();\r\n    \/\/ Script corresponde ao seu c\u00f3digo fonte\r\n    private static Script script;\r\n    \r\n    \/* Fun\u00e7\u00e3o que retorna o c\u00f3digo fonte do Groovy \r\n        Pega o c\u00f3digo fonte que esteja no classpath da aplica\u00e7\u00e3o*\/\r\n    private String getCodigoFonte() throws IOException {\r\n        InputStream streamEntrada = getClass().getClassLoader().getResourceAsStream(&quot;EnderecoParser.groovy&quot;);\r\n        if (streamEntrada != null) {\r\n            BufferedReader reader = new BufferedReader(new InputStreamReader(streamEntrada));\r\n            String str = null;\r\n            StringBuilder builder = new StringBuilder();\r\n            while ((str = reader.readLine()) != null) {\r\n                builder.append(str).append(&quot;\\n&quot;);\r\n            }\r\n            reader.close();\r\n            return builder.toString();\r\n        }\r\n        return null;\r\n    }\r\n    \/\/ Recebo como parametro o XML armazenado em uma String\r\n    public List getActions(String str) throws IOException {\r\n        if (str != null) {\r\n           \/\/ Passo esta vari\u00e1vel ao meu script groovy (o mesmo c\u00f3digo que citei acima!)\r\n            binding.setVariable(&quot;str&quot;, str);\r\n            if (shell == null) {\r\n                shell = new GroovyShell(binding);\r\n                script = shell.parse(getCodigoFonte());\r\n            }\r\n           \/*\r\n                     Eu poderia ter uma classe chamada Endereco, que \u00e9 populada com os dados do XML\r\n                     pelo pr\u00f3prio parser.\r\n            *\/\r\n              return  (List) script.run();\r\n          }\r\n        return null;\r\n    }\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Sempre achei XML paradoxal. Por um lado, trata-se de uma tecnologia fant\u00e1stica: a sintaxe do XML \u00e9 simpl\u00edssima. Qualquer um consegue gerar um documento no formato XML. No entanto, em contrapartida, ler o bem dito documento (ao menos em Java) pode ser um supl\u00edcio. H\u00e1 ferramentas que facilitam este trabalho (Dom4J, XStreamer, etc.), mas \u00e9 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,5,6],"tags":[],"class_list":["post-67","post","type-post","status-publish","format-standard","hentry","category-grails","category-groovy","category-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Lendo XML com Groovy (ou como causar inveja em um programador Java (e depois satisfaz\u00ea-la!)) - (ou ainda, como ler XML SEMPRE deveria ter sido) - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=67\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Lendo XML com Groovy (ou como causar inveja em um programador Java (e depois satisfaz\u00ea-la!)) - (ou ainda, como ler XML SEMPRE deveria ter sido) - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Sempre achei XML paradoxal. Por um lado, trata-se de uma tecnologia fant\u00e1stica: a sintaxe do XML \u00e9 simpl\u00edssima. Qualquer um consegue gerar um documento no formato XML. No entanto, em contrapartida, ler o bem dito documento (ao menos em Java) pode ser um supl\u00edcio. H\u00e1 ferramentas que facilitam este trabalho (Dom4J, XStreamer, etc.), mas \u00e9 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=67\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2008-09-02T12:12:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2008-09-08T03:28:21+00:00\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=67\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=67\",\"name\":\"Lendo XML com Groovy (ou como causar inveja em um programador Java (e depois satisfaz\u00ea-la!)) - (ou ainda, como ler XML SEMPRE deveria ter sido) - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"datePublished\":\"2008-09-02T12:12:26+00:00\",\"dateModified\":\"2008-09-08T03:28:21+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=67#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=67\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=67#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Lendo XML com Groovy (ou como causar inveja em um programador Java (e depois satisfaz\u00ea-la!)) &#8211; (ou ainda, como ler XML SEMPRE deveria ter sido)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Lendo XML com Groovy (ou como causar inveja em um programador Java (e depois satisfaz\u00ea-la!)) - (ou ainda, como ler XML SEMPRE deveria ter sido) - \/dev\/Kico","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:\/\/devkico.itexto.com.br\/?p=67","og_locale":"pt_BR","og_type":"article","og_title":"Lendo XML com Groovy (ou como causar inveja em um programador Java (e depois satisfaz\u00ea-la!)) - (ou ainda, como ler XML SEMPRE deveria ter sido) - \/dev\/Kico","og_description":"Sempre achei XML paradoxal. Por um lado, trata-se de uma tecnologia fant\u00e1stica: a sintaxe do XML \u00e9 simpl\u00edssima. Qualquer um consegue gerar um documento no formato XML. No entanto, em contrapartida, ler o bem dito documento (ao menos em Java) pode ser um supl\u00edcio. H\u00e1 ferramentas que facilitam este trabalho (Dom4J, XStreamer, etc.), mas \u00e9 [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=67","og_site_name":"\/dev\/Kico","article_published_time":"2008-09-02T12:12:26+00:00","article_modified_time":"2008-09-08T03:28:21+00:00","author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=67","url":"https:\/\/devkico.itexto.com.br\/?p=67","name":"Lendo XML com Groovy (ou como causar inveja em um programador Java (e depois satisfaz\u00ea-la!)) - (ou ainda, como ler XML SEMPRE deveria ter sido) - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"datePublished":"2008-09-02T12:12:26+00:00","dateModified":"2008-09-08T03:28:21+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=67#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=67"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=67#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Lendo XML com Groovy (ou como causar inveja em um programador Java (e depois satisfaz\u00ea-la!)) &#8211; (ou ainda, como ler XML SEMPRE deveria ter sido)"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/67"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=67"}],"version-history":[{"count":5,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/67\/revisions"}],"predecessor-version":[{"id":77,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/67\/revisions\/77"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=67"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=67"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=67"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}