{"id":34222,"date":"2023-08-18T13:54:02","date_gmt":"2023-08-18T13:54:02","guid":{"rendered":"https:\/\/www.ntsplhosting.com\/blog\/?p=34222"},"modified":"2023-08-18T13:55:26","modified_gmt":"2023-08-18T13:55:26","slug":"introducing-new-sql-functions-to-manipulate-your-json-data-in-bigquery","status":"publish","type":"post","link":"https:\/\/www.ntsplhosting.com\/blog\/introducing-new-sql-functions-to-manipulate-your-json-data-in-bigquery\/","title":{"rendered":"Introducing new SQL functions to manipulate your JSON data in BigQuery"},"content":{"rendered":"<div class=\"block-paragraph\">\n<div class=\"rich-text\">\n<p>Enterprises are generating data at an exponential rate, spanning traditional structured transactional data, semi-structured like JSON and unstructured data like images and audio. Beyond the scale of the data, these divergent types present processing challenges for developers, at times requiring separate processing flows for each. With its initial release <a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/json-data\">BigQuery\u2019s support for semi-structured JSON<\/a> eliminated the need for such complex preprocessing and providing schema flexibility, intuitive querying and the scalability benefits afforded to structured data.<\/p>\n<p>Today, we are excited to announce the release of new SQL functions for BigQuery JSON, extending the power and flexibility of our core JSON support. These functions make it even easier to extract and construct JSON data and perform complex data analysis.<\/p>\n<p>With these new query functions, you can:<\/p>\n<ul>\n<li>Convert JSON values into primitive types (INT64, FLOAT64, BOOL and STRING) in an easier and more flexible way with the new <a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#lax_converters\">JSON LAX functions<\/a><\/li>\n<li>Easily update and modify an existing JSON value in BigQuery\u00a0 with the new <a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#mutators\">JSON \u00a0mutator functions<\/a>.<\/li>\n<li>Construct JSON object and JSON array with SQL in BigQuery with the new <a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#constructors\">JSON constructor functions<\/a>.<\/li>\n<\/ul>\n<p>Let&#8217;s review these new features and some examples of how to use them. First, we will create a table for demonstration.<\/p>\n<\/div>\n<\/div>\n<div class=\"block-code\">\n<dl>\n<dt>code_block<\/dt>\n<dd>[StructValue([(u&#8217;code&#8217;, u&#8217;CREATE TABLE dataset_name.users_sample AS (rn SELECT JSON &#8216;{&#8220;name&#8221;: &#8220;Alice&#8221;, &#8220;age&#8221;: 28, &#8220;address&#8221;: {&#8220;country&#8221;: &#8220;USA&#8221;, &#8220;city&#8221;: &#8220;SF&#8221;, &#8220;zipcode&#8221;: 94102}}&#8217; AS user UNION ALLrn SELECT JSON &#8216;{&#8220;name&#8221;: &#8220;Bob&#8221;, &#8220;age&#8221;: &#8220;40&#8221;, &#8220;address&#8221;: {&#8220;country&#8221;: &#8220;Germany&#8221;}}&#8217; UNION ALLrn SELECT JSON &#8216;{&#8220;name&#8221;: &#8220;Charlie&#8221;, &#8220;age&#8221;: null, &#8220;address&#8221;: {&#8220;zipcode&#8221;: 12356, &#8220;country&#8221;: null}}&#8217;rn)&#8217;), (u&#8217;language&#8217;, u&#8221;), (u&#8217;caption&#8217;, &lt;wagtail.wagtailcore.rich_text.RichText object at 0x3eed6b045a50&gt;)])]<\/dd>\n<\/dl>\n<\/div>\n<div class=\"block-code\">\n<dl>\n<dt>code_block<\/dt>\n<dd>[StructValue([(u&#8217;code&#8217;, u&#8217;Query:rnrn&#8211; Table contentsrnSELECT * FROM dataset_name.users_sample ORDER BY STRING(user.name);rnOutput:rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+rn| user |rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+rn| {&#8220;address&#8221;:{&#8220;city&#8221;:&#8221;SF&#8221;,&#8221;country&#8221;:&#8221;USA&#8221;,&#8221;zipcode&#8221;:94102},&#8221;age&#8221;:28,&#8221;name&#8221;:&#8221;Alice&#8221;} |rn| {&#8220;address&#8221;:{&#8220;country&#8221;:&#8221;Germany&#8221;},&#8221;age&#8221;:&#8221;40&#8243;,&#8221;name&#8221;:&#8221;Bob&#8221;} |rn| {&#8220;address&#8221;:{&#8220;country&#8221;:null,&#8221;zipcode&#8221;:12356},&#8221;age&#8221;:null,&#8221;name&#8221;:&#8221;Charlie&#8221;} |rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8217;), (u&#8217;language&#8217;, u&#8221;), (u&#8217;caption&#8217;, &lt;wagtail.wagtailcore.rich_text.RichText object at 0x3eed6b045550&gt;)])]<\/dd>\n<\/dl>\n<\/div>\n<div class=\"block-paragraph\">\n<div class=\"rich-text\">\n<p>Great! Let\u2019s say we want to get a list of all users over 30. Looking at the table, you will see that user.age contains a JSON number in the first record, a JSON string in the second, and a JSON null in the third. With the new powerful LAX function, LAX_INT64, all types are automatically inferred and processed correctly.<\/p>\n<\/div>\n<\/div>\n<div class=\"block-code\">\n<dl>\n<dt>code_block<\/dt>\n<dd>[StructValue([(u&#8217;code&#8217;, u&#8217;Query:rnrnrnSELECT user.name FROM dataset_name.users_samplernWHERE LAX_INT64(user.age) &gt; 30rnOutput:rn+&#8212;&#8212;-+rn| name |rn+&#8212;&#8212;-+rn| &#8220;Bob&#8221; |rn+&#8212;&#8212;-+&#8217;), (u&#8217;language&#8217;, u&#8221;), (u&#8217;caption&#8217;, &lt;wagtail.wagtailcore.rich_text.RichText object at 0x3eed74a49890&gt;)])]<\/dd>\n<\/dl>\n<\/div>\n<div class=\"block-paragraph\">\n<div class=\"rich-text\">\n<p>Unlike the <a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#converters\">\u201cstrict\u201d conversion functions<\/a>, which require that the JSON type matches the primitive type exactly, the \u201clax\u201d conversion functions will also handle conversions between mismatched data types.<\/p>\n<p>For example, the strict conversion function below would return an error:<\/p>\n<\/div>\n<\/div>\n<div class=\"block-code\">\n<dl>\n<dt>code_block<\/dt>\n<dd>[StructValue([(u&#8217;code&#8217;, u&#8217;Query:rnrnSELECT INT64(JSON &#8216;&#8221;10&#8243;&#8216;) AS strict_int64rnOutput:rnError: The provided JSON input is not an integer&#8217;), (u&#8217;language&#8217;, u&#8221;), (u&#8217;caption&#8217;, &lt;wagtail.wagtailcore.rich_text.RichText object at 0x3eed7424e410&gt;)])]<\/dd>\n<\/dl>\n<\/div>\n<div class=\"block-paragraph\">\n<div class=\"rich-text\">\n<p>However, the lax conversion function below would return the desired result:<\/p>\n<\/div>\n<\/div>\n<div class=\"block-code\">\n<dl>\n<dt>code_block<\/dt>\n<dd>[StructValue([(u&#8217;code&#8217;, u&#8217;Query:rnrnSELECT LAX_INT64(JSON &#8216;&#8221;10&#8243;&#8216;) AS lax_int64rnOutput:rn+&#8212;&#8212;&#8212;&#8211;+rn| lax_int64 |rn+&#8212;&#8212;&#8212;&#8211;+rn| 10 |rn+&#8212;&#8212;&#8212;&#8211;+&#8217;), (u&#8217;language&#8217;, u&#8221;), (u&#8217;caption&#8217;, &lt;wagtail.wagtailcore.rich_text.RichText object at 0x3eed7424ef10&gt;)])]<\/dd>\n<\/dl>\n<\/div>\n<div class=\"block-paragraph\">\n<div class=\"rich-text\">\n<p>Furthermore, you can quickly and easily remove a field in the JSON data by using JSON_REMOVE functions.<\/p>\n<\/div>\n<\/div>\n<div class=\"block-code\">\n<dl>\n<dt>code_block<\/dt>\n<dd>[StructValue([(u&#8217;code&#8217;, u&#8217;Query:rnrnrnUPDATE dataset_name.users_sample SET user = JSON_REMOVE(user, &#8220;$.address.zipcode&#8221;)rnWHERE truernAfter the query above; if you run the query u201cSELECT * FROM dataset_name.users_sample ORDER BY STRING(user.name);u201d, you will receive the following Output:rnrnrn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+rn| user |rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+rn| {&#8220;address&#8221;:{&#8220;city&#8221;:&#8221;SF&#8221;,&#8221;country&#8221;:&#8221;USA&#8221;},&#8221;age&#8221;:28,&#8221;name&#8221;:&#8221;Alice&#8221;} |rn| {&#8220;address&#8221;:{&#8220;country&#8221;:&#8221;Germany&#8221;},&#8221;age&#8221;:&#8221;40&#8243;,&#8221;name&#8221;:&#8221;Bob&#8221;} |rn| {&#8220;address&#8221;:{&#8220;country&#8221;:null},&#8221;age&#8221;:null,&#8221;name&#8221;:&#8221;Charlie&#8221;} |rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8217;), (u&#8217;language&#8217;, u&#8221;), (u&#8217;caption&#8217;, &lt;wagtail.wagtailcore.rich_text.RichText object at 0x3eed8a38cd10&gt;)])]<\/dd>\n<\/dl>\n<\/div>\n<div class=\"block-paragraph\">\n<div class=\"rich-text\">\n<p>JSON_STRIP_NULLS compresses the data by removing JSON nulls. Although BigQuery null values neither impact performance nor storage cost, it can be helpful for reducing data size during exports.<\/p>\n<\/div>\n<\/div>\n<div class=\"block-code\">\n<dl>\n<dt>code_block<\/dt>\n<dd>[StructValue([(u&#8217;code&#8217;, u&#8217;Query:rnrnrnUPDATE dataset_name.users_sample SET user = JSON_STRIP_NULLS(user, remove_empty=&gt;true) WHERE truernAfter the query above; if you run the query u201cSELECT * FROM dataset_name.users_sample ORDER BY STRING(user.name);u201d, you will receive the following Output:rnrnrn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+rn| user |rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+rn| {&#8220;address&#8221;:{&#8220;city&#8221;:&#8221;SF&#8221;,&#8221;country&#8221;:&#8221;USA&#8221;},&#8221;age&#8221;:28,&#8221;name&#8221;:&#8221;Alice&#8221;} |rn| {&#8220;address&#8221;:{&#8220;country&#8221;:&#8221;Germany&#8221;},&#8221;age&#8221;:&#8221;40&#8243;,&#8221;name&#8221;:&#8221;Bob&#8221;} |rn| {&#8220;name&#8221;:&#8221;Charlie&#8221;} |rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8217;), (u&#8217;language&#8217;, u&#8221;), (u&#8217;caption&#8217;, &lt;wagtail.wagtailcore.rich_text.RichText object at 0x3eed7469b3d0&gt;)])]<\/dd>\n<\/dl>\n<\/div>\n<div class=\"block-paragraph\">\n<div class=\"rich-text\">\n<p>Now, what if we want to modify or add a field to the JSON data?<\/p>\n<p>You can now update the data with the new JSON_SET function. And you have the ability to mix and match JSON functions together to achieve desired results.<\/p>\n<p>For example, the query below adds a new field, &#8220;region_code&#8221;, to the table. The value of the field will be &#8220;America&#8221; if the value of the &#8220;country&#8221; field is &#8220;USA&#8221;, and &#8220;Other&#8221; if it is not.<\/p>\n<\/div>\n<\/div>\n<div class=\"block-code\">\n<dl>\n<dt>code_block<\/dt>\n<dd>[StructValue([(u&#8217;code&#8217;, u&#8217;&#8211; Updating\/Adding a field is easy to do as well. The structure will be automatically created (see &#8220;Charlie&#8221; row)rnrnQuery:rnrnUPDATE dataset_name.users_sample SET user = JSON_SET(user, &#8220;$.address.region_code&#8221;, IF(LAX_STRING(user.address.country) = &#8220;USA&#8221;, &#8220;America&#8221;, &#8220;Other&#8221;)) WHERE truernAfter the query above; if you run the query u201cSELECT * FROM dataset_name.users_sample ORDER BY STRING(user.name);u201d, you will receive the following Output:rnrn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+rn| user |rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+rn| {&#8220;address&#8221;:{&#8220;city&#8221;:&#8221;SF&#8221;,&#8221;country&#8221;:&#8221;USA&#8221;,&#8221;region_code&#8221;:&#8221;America&#8221;},&#8221;age&#8221;:28,&#8221;name&#8221;:&#8221;Alice&#8221;} |rn| {&#8220;address&#8221;:{&#8220;country&#8221;:&#8221;Germany&#8221;,&#8221;region_code&#8221;:&#8221;Other&#8221;},&#8221;age&#8221;:&#8221;40&#8243;,&#8221;name&#8221;:&#8221;Bob&#8221;} |rn| {&#8220;address&#8221;:{&#8220;region_code&#8221;:&#8221;Other&#8221;},&#8221;name&#8221;:&#8221;Charlie&#8221;} |rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8217;), (u&#8217;language&#8217;, u&#8221;), (u&#8217;caption&#8217;, &lt;wagtail.wagtailcore.rich_text.RichText object at 0x3eed7469b590&gt;)])]<\/dd>\n<\/dl>\n<\/div>\n<div class=\"block-paragraph\">\n<div class=\"rich-text\">\n<p>Last but not least, let\u2019s say you have a table of property\/value pairs you want to convert to a JSON object. With the new JSON_OBJECT constructor function, you can effortlessly create the new JSON object.<\/p>\n<\/div>\n<\/div>\n<div class=\"block-code\">\n<dl>\n<dt>code_block<\/dt>\n<dd>[StructValue([(u&#8217;code&#8217;, u&#8217;Query:rnrnWITH Fruits AS (rnSELECT 0 AS id, &#8216;color&#8217; AS k, &#8216;Red&#8217; AS v UNION ALLrnSELECT 0, &#8216;fruit&#8217;, &#8216;apple&#8217; UNION ALLrnSELECT 1, &#8216;fruit&#8217;,&#8217;banana&#8217; UNION ALLrnSELECT 1, &#8216;ripe&#8217;, &#8216;true&#8217;rn)rnSELECT JSON_OBJECT(ARRAY_AGG(k), ARRAY_AGG(v)) AS json_datarnFROM FruitsrnGROUP BY idrnOutput:rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+rn| json_data |rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+rn| {&#8220;color&#8221;:&#8221;Red&#8221;,&#8221;fruit&#8221;:&#8221;apple&#8221;} |rn| {&#8220;fruit&#8221;:&#8221;banana&#8221;,&#8221;ripe&#8221;:&#8221;true&#8221;} |rn+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8217;), (u&#8217;language&#8217;, u&#8221;), (u&#8217;caption&#8217;, &lt;wagtail.wagtailcore.rich_text.RichText object at 0x3eed742dfa90&gt;)])]<\/dd>\n<\/dl>\n<\/div>\n<div class=\"block-paragraph\">\n<div class=\"rich-text\">\n<h3>Complete list of functions<\/h3>\n<p>Lax conversion functions:<\/p>\n<ul>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#lax_bool\">LAX_BOOL<\/a><\/li>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#lax_int64\">LAX_INT64<\/a><\/li>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#lax_double\">LAX_FLOAT64<\/a><\/li>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#lax_string\">LAX_STRING<\/a><\/li>\n<\/ul>\n<p>JSON constructor functions:<\/p>\n<ul>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#json_array\">JSON_ARRAY<\/a><\/li>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#json_object\">JSON_OBJECT<\/a><\/li>\n<\/ul>\n<p>JSON mutator functions:<\/p>\n<ul>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#json_array_append\">JSON_ARRAY_APPEND<\/a><\/li>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#json_array_insert\">JSON_ARRAY_INSERT<\/a><\/li>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#json_remove\">JSON_REMOVE<\/a><\/li>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#json_set\">JSON_SET<\/a><\/li>\n<li><a href=\"https:\/\/cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/json_functions#json_strip_nulls\">JSON_STRIP_NULLS<\/a><\/li>\n<\/ul>\n<h3>Try it out!<\/h3>\n<p>Google BigQuery is constantly adding new features to make it easier and more powerful to analyze your data. We encourage you to check them out and provide your <a href=\"https:\/\/cloud.google.com\/contact\/\">feedback<\/a> to us as we continue to develop additional features and capabilities to make working JSON easier and faster over time.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Enterprises are generating data at an exponential rate, spanning traditional structured transactional data, semi-structured like JSON and unstructured data like images and audio. Beyond the scale of the data, these divergent types present processing challenges for developers, at times requiring separate processing flows for each. With its initial release BigQuery\u2019s support for semi-structured JSON eliminated [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":34348,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[11,438],"tags":[527,526,528],"_links":{"self":[{"href":"https:\/\/www.ntsplhosting.com\/blog\/wp-json\/wp\/v2\/posts\/34222"}],"collection":[{"href":"https:\/\/www.ntsplhosting.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ntsplhosting.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ntsplhosting.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ntsplhosting.com\/blog\/wp-json\/wp\/v2\/comments?post=34222"}],"version-history":[{"count":3,"href":"https:\/\/www.ntsplhosting.com\/blog\/wp-json\/wp\/v2\/posts\/34222\/revisions"}],"predecessor-version":[{"id":34350,"href":"https:\/\/www.ntsplhosting.com\/blog\/wp-json\/wp\/v2\/posts\/34222\/revisions\/34350"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ntsplhosting.com\/blog\/wp-json\/wp\/v2\/media\/34348"}],"wp:attachment":[{"href":"https:\/\/www.ntsplhosting.com\/blog\/wp-json\/wp\/v2\/media?parent=34222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ntsplhosting.com\/blog\/wp-json\/wp\/v2\/categories?post=34222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ntsplhosting.com\/blog\/wp-json\/wp\/v2\/tags?post=34222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}