{"id":227,"date":"2026-08-12T18:56:57","date_gmt":"2026-08-12T16:56:57","guid":{"rendered":"https:\/\/www.visualdomain.ch\/?p=227"},"modified":"2026-08-19T05:40:41","modified_gmt":"2026-08-19T03:40:41","slug":"beyond-jsonpath-query-declarative-object-graph-queries-in-vcf-aria-orchestrator","status":"publish","type":"post","link":"https:\/\/www.visualdomain.ch\/?p=227","title":{"rendered":"VCF \/ Aria Orchestrator JSONPath: Declarative Object Graph Queries"},"content":{"rendered":"\r\n<div class=\"align wp-block-table-of-content-block-table-of-content\" id='tbcnbBlock-1' data-attributes='{&quot;isNested&quot;:true,&quot;header&quot;:{&quot;bgColor&quot;:&quot;rgba(27, 27, 27, 1)&quot;,&quot;textColor&quot;:&quot;#444&quot;,&quot;iconColor&quot;:&quot;rgba(203, 203, 203, 1)&quot;,&quot;separatorWidth&quot;:1,&quot;separatorColor&quot;:&quot;#ccc&quot;,&quot;txtColor&quot;:&quot;rgba(203, 203, 203, 1)&quot;},&quot;headings&quot;:[{&quot;contents&quot;:&quot;Introduction&quot;,&quot;tag&quot;:&quot;H2&quot;,&quot;id&quot;:&quot;bppb-heading-anchor-1&quot;},{&quot;contents&quot;:&quot;A Real-World Deployment Example&quot;,&quot;tag&quot;:&quot;H2&quot;,&quot;id&quot;:&quot;bppb-heading-anchor-2&quot;},{&quot;contents&quot;:&quot;The Same Query with RFC 9535&quot;,&quot;tag&quot;:&quot;H2&quot;,&quot;id&quot;:&quot;bppb-heading-anchor-3&quot;},{&quot;contents&quot;:&quot;When Top-Down Queries Become More Complex&quot;,&quot;tag&quot;:&quot;H2&quot;,&quot;id&quot;:&quot;bppb-heading-anchor-4&quot;},{&quot;contents&quot;:&quot;Parent Traversal with ^&quot;,&quot;tag&quot;:&quot;H2&quot;,&quot;id&quot;:&quot;bppb-heading-anchor-5&quot;},{&quot;contents&quot;:&quot;Filtering the Current Node with ??&quot;,&quot;tag&quot;:&quot;H2&quot;,&quot;id&quot;:&quot;bppb-heading-anchor-6&quot;},{&quot;contents&quot;:&quot;Combining ^ and ??&quot;,&quot;tag&quot;:&quot;H2&quot;,&quot;id&quot;:&quot;bppb-heading-anchor-7&quot;},{&quot;contents&quot;:&quot;Using It in VCF\\\/Aria Orchestrator&quot;,&quot;tag&quot;:&quot;H2&quot;,&quot;id&quot;:&quot;bppb-heading-anchor-8&quot;},{&quot;contents&quot;:&quot;Compatibility and Origins&quot;,&quot;tag&quot;:&quot;H2&quot;,&quot;id&quot;:&quot;bppb-heading-anchor-9&quot;},{&quot;contents&quot;:&quot;Conclusion&quot;,&quot;tag&quot;:&quot;H2&quot;,&quot;id&quot;:&quot;bppb-heading-anchor-10&quot;},{&quot;contents&quot;:&quot;AI Disclosure&quot;,&quot;tag&quot;:&quot;H2&quot;,&quot;id&quot;:&quot;bppb-heading-anchor-11&quot;}],&quot;boxList&quot;:{&quot;txtStyle&quot;:&quot;normal&quot;,&quot;nTxtColor&quot;:&quot;rgba(203, 203, 203, 1)&quot;,&quot;nBarColor&quot;:&quot;#b0aeb1&quot;,&quot;hTxtColor&quot;:&quot;#ec1e75&quot;,&quot;hBarColor&quot;:&quot;#ec1e75&quot;,&quot;nTxtDecoration&quot;:false,&quot;hTxtDecoration&quot;:false,&quot;dotSize&quot;:15,&quot;panelHeight&quot;:0,&quot;treeColor&quot;:&quot;blueviolet&quot;,&quot;dotShadow&quot;:[{&quot;hOffset&quot;:&quot;1px&quot;,&quot;vOffset&quot;:&quot;1px&quot;,&quot;blur&quot;:&quot;5px&quot;,&quot;spreed&quot;:&quot;1px&quot;,&quot;color&quot;:&quot;#b3b3b3&quot;,&quot;isInset&quot;:false}],&quot;maxHeight&quot;:{&quot;desktop&quot;:0,&quot;tablet&quot;:0,&quot;mobile&quot;:0},&quot;padding&quot;:{&quot;desktop&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;20px&quot;,&quot;right&quot;:&quot;0px&quot;},&quot;tablet&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;20px&quot;,&quot;right&quot;:&quot;0px&quot;},&quot;mobile&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;20px&quot;,&quot;right&quot;:&quot;0px&quot;}}},&quot;title&quot;:{&quot;text&quot;:&quot;Table of Contents&quot;,&quot;tag&quot;:&quot;h2&quot;},&quot;advanced&quot;:{&quot;dimension&quot;:{&quot;padding&quot;:{&quot;desktop&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;right&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;0px&quot;},&quot;tablet&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;right&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;0px&quot;},&quot;mobile&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;right&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;0px&quot;}}},&quot;borderShadow&quot;:{&quot;normal&quot;:{&quot;radius&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;right&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;0px&quot;},&quot;shadow&quot;:[{&quot;hOffset&quot;:&quot;0px&quot;,&quot;vOffset&quot;:&quot;0px&quot;,&quot;blur&quot;:&quot;0px&quot;,&quot;spreed&quot;:&quot;0px&quot;,&quot;color&quot;:&quot;#7090b0&quot;,&quot;isInset&quot;:false}]}},&quot;background&quot;:{&quot;normal&quot;:{&quot;type&quot;:&quot;color&quot;,&quot;color&quot;:&quot;linear-gradient(135deg,rgb(27,27,27) 0%,rgb(27,27,27) 100%)&quot;,&quot;gradient&quot;:{&quot;type&quot;:&quot;radial&quot;,&quot;radialType&quot;:&quot;ellipse&quot;,&quot;colors&quot;:[{&quot;color&quot;:&quot;rgba(58, 66, 222, 1)&quot;,&quot;position&quot;:&quot;0&quot;},{&quot;color&quot;:&quot;rgba(176, 195, 235, 1)&quot;,&quot;position&quot;:&quot;80&quot;}],&quot;centerPositions&quot;:{&quot;x&quot;:50,&quot;y&quot;:50},&quot;angel&quot;:90},&quot;img&quot;:{&quot;url&quot;:&quot;&quot;,&quot;desktop&quot;:{&quot;position&quot;:&quot;center center&quot;,&quot;xPosition&quot;:0,&quot;yPosition&quot;:0,&quot;attachment&quot;:&quot;&quot;,&quot;repeat&quot;:&quot;no-repeat&quot;,&quot;size&quot;:&quot;&quot;,&quot;customSize&quot;:&quot;0px&quot;},&quot;tablet&quot;:{&quot;position&quot;:&quot;center center&quot;,&quot;xPosition&quot;:0,&quot;yPosition&quot;:0,&quot;attachment&quot;:&quot;&quot;,&quot;repeat&quot;:&quot;no-repeat&quot;,&quot;size&quot;:&quot;&quot;,&quot;customSize&quot;:&quot;0px&quot;},&quot;mobile&quot;:{&quot;position&quot;:&quot;center center&quot;,&quot;xPosition&quot;:0,&quot;yPosition&quot;:0,&quot;attachment&quot;:&quot;&quot;,&quot;repeat&quot;:&quot;no-repeat&quot;,&quot;size&quot;:&quot;&quot;,&quot;customSize&quot;:&quot;0px&quot;}},&quot;video&quot;:{&quot;url&quot;:&quot;&quot;,&quot;loop&quot;:false},&quot;transition&quot;:0.3},&quot;overlay&quot;:{&quot;isEnabled&quot;:false,&quot;colors&quot;:{&quot;type&quot;:&quot;color&quot;}}}},&quot;align&quot;:&quot;&quot;,&quot;rendered&quot;:true,&quot;tagName&quot;:[&quot;h1&quot;,&quot;h2&quot;,&quot;h3&quot;],&quot;markup&quot;:{&quot;view&quot;:&quot;decimal&quot;,&quot;icon&quot;:&quot;fa-solid fa-circle&quot;,&quot;color&quot;:&quot;#000&quot;,&quot;markupSize&quot;:{&quot;desktop&quot;:&quot;16px&quot;,&quot;tablet&quot;:&quot;16px&quot;,&quot;mobile&quot;:&quot;16px&quot;}},&quot;minimize&quot;:{&quot;toggle&quot;:true,&quot;expandIcon&quot;:&quot;fa-solid fa-chevron-down&quot;,&quot;collapseIcon&quot;:&quot;fa-solid fa-chevron-up&quot;},&quot;theme&quot;:&quot;default&quot;,&quot;sticky&quot;:{&quot;toggle&quot;:false,&quot;device&quot;:[&quot;Desktop&quot;],&quot;width&quot;:{&quot;desktop&quot;:&quot;617px&quot;,&quot;tablet&quot;:&quot;90%&quot;,&quot;mobile&quot;:&quot;100%&quot;},&quot;horizonAlign&quot;:&quot;left&quot;,&quot;verticalAlign&quot;:&quot;top&quot;,&quot;right&quot;:{&quot;desktop&quot;:&quot;0px&quot;,&quot;tablet&quot;:&quot;0px&quot;,&quot;mobile&quot;:&quot;0px&quot;},&quot;left&quot;:{&quot;desktop&quot;:&quot;0px&quot;,&quot;tablet&quot;:&quot;0px&quot;,&quot;mobile&quot;:&quot;0px&quot;},&quot;top&quot;:{&quot;desktop&quot;:&quot;0px&quot;,&quot;tablet&quot;:&quot;0px&quot;,&quot;mobile&quot;:&quot;0px&quot;},&quot;bottom&quot;:{&quot;desktop&quot;:&quot;0px&quot;,&quot;tablet&quot;:&quot;0px&quot;,&quot;mobile&quot;:&quot;0px&quot;},&quot;zIndex&quot;:{&quot;desktop&quot;:100,&quot;tablet&quot;:100,&quot;mobile&quot;:100}},&quot;slideTitle&quot;:{&quot;titleColor&quot;:&quot;#2e2e2e&quot;,&quot;slideBarColor&quot;:&quot;#abababbf&quot;,&quot;spaceDevice&quot;:&quot;desktop&quot;,&quot;space&quot;:{&quot;desktop&quot;:&quot;15px&quot;,&quot;tablet&quot;:&quot;15px&quot;,&quot;mobile&quot;:&quot;15px&quot;},&quot;spaceBottomDevice&quot;:&quot;desktop&quot;,&quot;spaceBottom&quot;:{&quot;desktop&quot;:&quot;15px&quot;,&quot;tablet&quot;:&quot;15px&quot;,&quot;mobile&quot;:&quot;15px&quot;},&quot;spaceBottomUnit&quot;:{&quot;desktop&quot;:&quot;px&quot;,&quot;tablet&quot;:&quot;px&quot;,&quot;mobile&quot;:&quot;px&quot;}},&quot;slideList&quot;:{&quot;spaceDevice&quot;:&quot;desktop&quot;,&quot;space&quot;:{&quot;desktop&quot;:&quot;15px&quot;,&quot;tablet&quot;:&quot;15px&quot;,&quot;mobile&quot;:&quot;15px&quot;},&quot;typo&quot;:{&quot;fontSize&quot;:{&quot;desktop&quot;:&quot;16px&quot;,&quot;tablet&quot;:&quot;&quot;,&quot;mobile&quot;:&quot;&quot;}},&quot;fontSize&quot;:{&quot;desktop&quot;:&quot;16px&quot;,&quot;tablet&quot;:&quot;16px&quot;,&quot;mobile&quot;:&quot;16px&quot;},&quot;fontUnit&quot;:{&quot;desktop&quot;:&quot;px&quot;,&quot;tablet&quot;:&quot;px&quot;,&quot;mobile&quot;:&quot;px&quot;}}}'><\/div>\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Querying JSON in VCF Operations Orchestrator and VMware Aria Automation Orchestrator often starts simple.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Find an object by name.<br>Select an item from an array.<br>Read a property somewhere below the root.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">For small structures, a few property accesses or loops are usually enough. But infrastructure data rarely stays simple. Configuration models, API responses, deployment metadata, and inventory data quickly become deeply nested structures where the condition you are looking for may exist several levels below the object you actually want to return.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Readers familiar with Java or C# may recognize a familiar programming model here. At a conceptual level, JSONPath has similarities to Java Streams or C# LINQ: instead of explicitly implementing iteration and condition handling, you describe which data should be selected and projected. The APIs and capabilities are different, but the underlying declarative way of thinking is similar.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">At this point, the traversal logic often starts to dominate the code.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Nested loops, temporary arrays, existence checks, and multiple levels of if statements describe how to walk through the object structure instead of what should be selected.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">This is the problem I wanted to solve with an extended JSONPath implementation for VCF Operations Orchestrator and Aria Automation Orchestrator.<\/p>\n\n\n\n<p class=\"is-style-default highlight-box ticss-62093dae has-accent-5-background-color has-background has-medium-font-size wp-block-paragraph\" style=\"border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--30)\"><strong>The idea is simple:<\/strong><br>Instead of manually traversing an object structure, describe the selection as a declarative query and let the query engine navigate the structure.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Standard JSONPath already provides a powerful foundation for navigating and filtering JSON. But for some real-world automation scenarios I wanted to go one step further.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">What if a query could find a deeply nested object and then traverse back to its parent?<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">What if that parent could be filtered again before continuing further up the structure?<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">And what if the complete operation could still be expressed as one readable query pipeline?<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">This turns JSONPath from a simple value selector into something that feels much closer to querying an object graph.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The result is a dependency-free JSONPath Action designed for VCF\/Aria Orchestrator. It keeps RFC 9535 as the default query language while providing an optional extended mode with two additional concepts: a self-filter and parent traversal.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Together, these extensions make both top-down and bottom-up queries possible without falling back to nested imperative loops.<\/p>\n\n\n\n<p class=\"is-style-default highlight-box ticss-62093dae has-accent-5-background-color has-background has-medium-font-size wp-block-paragraph\" style=\"border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--30)\">The complete implementation, documentation, and test suite are available on <strong><a href=\"https:\/\/github.com\/viscop\/orchestrator-jsonpath-extended\" data-type=\"post\" data-id=\"227\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a><\/strong>.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">This article does not try to reproduce the complete JSONPath reference or the project README. The goal is to show the problem with imperative object traversal, introduce the declarative query model, and demonstrate how nested filters, self-filtering, and parent traversal can make complex Orchestrator data structures significantly easier to query.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Real-World Deployment Example<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Consider a very simplified response returned by the VCF Automation deployment API.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>{\n  \"content\": [\n    {\n      \"name\": \"vm0006\",\n      \"inputs\": {\n        \"env\": \"dev\",\n        \"image\": \"Alma 10\",\n        \"software\": \"None\"\n      },\n      \"resources\": &#91;\n        {\n          \"name\": \"VM\",\n          \"type\": \"Cloud.vSphere.Machine\",\n          \"properties\": {\n            \"powerState\": \"OFF\",\n            \"resourceName\": \"vm0006\"\n          }\n        },\n        {\n          \"name\": \"Network\",\n          \"type\": \"Cloud.vSphere.Network\",\n          \"properties\": {\n            \"resourceName\": \"net0002\"\n          }\n        }\n      &#93;\n    },\n    {\n      \"name\": \"vm0004\",\n      \"inputs\": {\n        \"env\": \"dev\",\n        \"image\": \"Windows Server 2022\",\n        \"software\": \"SQL\"\n      },\n      \"resources\": [\n        {\n          \"name\": \"HDD&#91;0&#93;\",\n          \"type\": \"Cloud.vSphere.Disk\",\n          \"properties\": {\n            \"resourceName\": \"vm0004 HDD1 D\"\n          }\n        },\n        {\n          \"name\": \"VM\",\n          \"type\": \"Cloud.vSphere.Machine\",\n          \"properties\": {\n            \"powerState\": \"ON\",\n            \"resourceName\": \"vm0004\"\n          }\n        },\n        {\n          \"name\": \"Network\",\n          \"type\": \"Cloud.vSphere.Network\",\n          \"properties\": {\n            \"resourceName\": \"net0003\"\n          }\n        }\n      ]\n    }\n  ]\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">&quot;content&quot;<\/span><span style=\"color: #D4D4D4\">: [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;name&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;vm0006&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;inputs&quot;<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">&quot;env&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;dev&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">&quot;image&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Alma 10&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">&quot;software&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;None&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;resources&quot;<\/span><span style=\"color: #D4D4D4\">: &#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;name&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;VM&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;type&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Cloud.vSphere.Machine&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;properties&quot;<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">&quot;powerState&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;OFF&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">&quot;resourceName&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;vm0006&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;name&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Network&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;type&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Cloud.vSphere.Network&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;properties&quot;<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">&quot;resourceName&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;net0002&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;name&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;vm0004&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;inputs&quot;<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">&quot;env&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;dev&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">&quot;image&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Windows Server 2022&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">&quot;software&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;SQL&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">&quot;resources&quot;<\/span><span style=\"color: #D4D4D4\">: [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;name&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;HDD&#91;0&#93;&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;type&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Cloud.vSphere.Disk&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;properties&quot;<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">&quot;resourceName&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;vm0004 HDD1 D&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;name&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;VM&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;type&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Cloud.vSphere.Machine&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;properties&quot;<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">&quot;powerState&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;ON&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">&quot;resourceName&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;vm0004&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        },<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;name&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Network&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;type&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;Cloud.vSphere.Network&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">&quot;properties&quot;<\/span><span style=\"color: #D4D4D4\">: {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">&quot;resourceName&quot;<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&quot;net0003&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The response contains multiple deployments. Each deployment contains its own input data and a list of resources such as virtual machines, disks, and networks.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">For this example, we want to answer a simple question:<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>Which deployment contains a vSphere disk resource and was created using the Windows Server 2022 image?<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The interesting part is that the two conditions are located at different levels of the object structure.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The image belongs to the deployment:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>deployment.inputs.image<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #9CDCFE\">deployment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">inputs<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">image<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The resource type belongs to an entry inside the nested <code>resources<\/code> array:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>deployment.resources&#91;*&#93;.type<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #9CDCFE\">deployment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">resources<\/span><span style=\"color: #D4D4D4\">&#91;*&#93;.<\/span><span style=\"color: #9CDCFE\">type<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">A traditional implementation therefore has to iterate over the deployments, inspect their resources, identify matching disk resources, and then continue working with the deployment that owns those resources.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>var result = [];\n\nfor (var i = 0; i &lt; deployments.content.length; i++) {\n    var deployment = deployments.content&#91;i&#93;;\n\n    if (deployment.inputs.image !== \"Windows Server 2022\") {\n        continue;\n    }\n\n    for (var j = 0; j &lt; deployment.resources.length; j++) {\n        var resource = deployment.resources&#91;j&#93;;\n\n        if (resource.type === \"Cloud.vSphere.Disk\") {\n            result.push(deployment.name);\n            break;\n        }\n    }\n}\n\nreturn result; \/\/ returns &#91;\"vm0004\"&#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\"> = [];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #9CDCFE\">deployments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">deployment<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">deployments<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">deployment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">inputs<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">image<\/span><span style=\"color: #D4D4D4\"> !== <\/span><span style=\"color: #CE9178\">&quot;Windows Server 2022&quot;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">continue<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #9CDCFE\">deployment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">resources<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">resource<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">deployment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">resources<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #9CDCFE\">j<\/span><span style=\"color: #D4D4D4\">&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">resource<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">type<\/span><span style=\"color: #D4D4D4\"> === <\/span><span style=\"color: #CE9178\">&quot;Cloud.vSphere.Disk&quot;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">push<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">deployment<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">name<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">break<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #6A9955\">\/\/ returns &#91;&quot;vm0004&quot;&#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">There is nothing wrong with this implementation. For one condition and two levels, the code is still manageable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Same Query with RFC 9535<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"is-style-default has-medium-font-size wp-block-paragraph\">The same selection can already be expressed much more directly with standard RFC 9535 JSONPath.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">In this case, the outer filter operates on deployments, while the nested filter checks whether the current deployment contains at least one <code>Cloud.vSphere.Disk<\/code> resource.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$.content[?\n    @.inputs.image == 'Windows Server 2022' &amp;&amp;\n    @.resources&#91;?@.type == 'Cloud.vSphere.Disk'&#93;\n].name<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #9CDCFE\">$<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">[?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    @.<\/span><span style=\"color: #9CDCFE\">inputs<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">image<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&#39;Windows Server 2022&#39;<\/span><span style=\"color: #D4D4D4\"> &amp;&amp;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    @.<\/span><span style=\"color: #9CDCFE\">resources<\/span><span style=\"color: #D4D4D4\">&#91;?@.<\/span><span style=\"color: #9CDCFE\">type<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&#39;Cloud.vSphere.Disk&#39;<\/span><span style=\"color: #D4D4D4\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">name<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Both implementations return the same result. The difference is not what they do, but how the selection is expressed.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">For this example, standard JSONPath is enough. No extension is required.<\/p>\n\n\n\n<p class=\"is-style-default highlight-box ticss-62093dae has-accent-5-background-color has-background has-medium-font-size wp-block-paragraph\" style=\"border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--30)\">The complete syntax reference, supported query modes, examples, extension semantics, and testing information are documented in the <a href=\"https:\/\/github.com\/viscop\/orchestrator-jsonpath-extended\" target=\"_blank\" rel=\"noreferrer noopener\"> GitHub repository<\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Standard JSONPath expressions can also be tested interactively at <a href=\"https:\/\/jsonpath.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">jsonpath.com<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">When Top-Down Queries Become More Complex<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">For the previous example, standard JSONPath provides a clean solution because<br>the query naturally starts with the deployment that we ultimately want to<br>return.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The deployment is filtered by its own properties, while nested filters inspect<br>the resources below it.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">This works very well as long as the query can be expressed naturally from the<br>top down.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Infrastructure data, however, is not always queried that way.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Sometimes the easiest object to identify is located several levels below the<br>object we actually want to return.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">For example, we may first identify a specific resource and then need to continue<br>with the deployment that owns it.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Conceptually, the traversal direction changes:<\/p>\n\n\n\n<pre class=\"wp-block-code has-d-4-d-4-d-4-color has-text-color\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.039), 0.9rem);\"><code>deployment\n    \u2193\nresources\n    \u2193\nmatching resource<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">but the desired result is:<\/p>\n\n\n\n<pre class=\"wp-block-code has-d-4-d-4-d-4-color has-text-color\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.039), 0.9rem);\"><code>matching resource\n    \u2191\ndeployment<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Standard JSONPath is primarily designed for selecting nodes while traversing away from the root. Once a deeply nested node has been selected, there is no RFC 9535 operator for navigating back to its parent.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Parent Traversal with <code>^<\/code><\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The first extension addresses exactly this limitation.<br>The <code>^<\/code> operator moves one normalized path level toward the root.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">For example:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$.content&#91;*&#93;.resources&#91;?(@.type == 'Cloud.vSphere.Disk')&#93;^<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #9CDCFE\">$<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">&#91;*&#93;.<\/span><span style=\"color: #9CDCFE\">resources<\/span><span style=\"color: #D4D4D4\">&#91;?(@.<\/span><span style=\"color: #9CDCFE\">type<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&#39;Cloud.vSphere.Disk&#39;<\/span><span style=\"color: #D4D4D4\">)&#93;^<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">This query first selects matching disk resources and then moves one level up.<\/p>\n\n\n\n<p class=\"is-style-default highlight-box ticss-62093dae has-accent-5-background-color has-background has-medium-font-size wp-block-paragraph\" style=\"border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--30)\">An important detail is that arrays are part of the path as well. A resource is<br>an element of the <code>resources<\/code> array, so one parent step reaches the array itself,<br>not the deployment.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">To reach the deployment, two parent steps are required:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$.content&#91;*&#93;.resources&#91;?(@.type == 'Cloud.vSphere.Disk')&#93;^^<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #9CDCFE\">$<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">&#91;*&#93;.<\/span><span style=\"color: #9CDCFE\">resources<\/span><span style=\"color: #D4D4D4\">&#91;?(@.<\/span><span style=\"color: #9CDCFE\">type<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&#39;Cloud.vSphere.Disk&#39;<\/span><span style=\"color: #D4D4D4\">)&#93;^^<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.039), 0.9rem);\"><code>Cloud.vSphere.Disk resource\n        \u2191\nresources array\n        \u2191\ndeployment<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The <code>^<\/code> parent operator follows the syntax introduced by JSONPath Plus. It is<br>available in the extended query modes of this implementation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Filtering the Current Node with <code>??<\/code><\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">At this point we can navigate back to the owning deployment.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">But there is still one problem.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">A regular JSONPath filter evaluates the elements or member values of the current container. After moving back to the deployment, however, we want to evaluate the deployment node itself.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">This is what the self-filter <code>??(...)<\/code> is for.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The self-filter evaluates the current node instead of iterating over its<br>children.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">For example:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$.content&#91;*&#93;&#91;??(@.inputs.image == 'Windows Server 2022')&#93;.name<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #9CDCFE\">$<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">&#91;*&#93;&#91;??(@.<\/span><span style=\"color: #9CDCFE\">inputs<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">image<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&#39;Windows Server 2022&#39;<\/span><span style=\"color: #D4D4D4\">)&#93;.<\/span><span style=\"color: #9CDCFE\">name<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Here, <code>@<\/code> represents the deployment itself.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The query therefore keeps only deployments whose <code>inputs.image<\/code> property is<br><code>Windows Server 2022<\/code>.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Result:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&#91;\"vm0004\"&#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #CE9178\">&quot;vm0004&quot;<\/span><span style=\"color: #D4D4D4\">&#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The distinction between the two filter types is important:<\/p>\n\n\n\n<p class=\"is-style-default highlight-box ticss-62093dae has-accent-5-background-color has-background has-medium-font-size wp-block-paragraph\" style=\"border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--30)\">?(\u2026) evaluates the elements or member values of the current container<br>??(\u2026) evaluates the current node itself<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The <code>??(...)<\/code> self-filter is a project-specific extension provided by this<br>implementation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Combining <code>^<\/code> and <code>??<\/code><\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Individually, both extensions solve a small navigation problem.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The parent operator <code>^<\/code> lets us move upward in the object structure, while the<br>self-filter <code>??(...)<\/code> lets us evaluate the node we have reached.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Combined, they allow us to express the previous example from the opposite<br>direction.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Instead of starting with the deployment and looking down into its resources, we<br>can first find the resource we are interested in and then work our way back to<br>the deployment.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$.content&#91;*&#93;.resources&#91;?(@.type == 'Cloud.vSphere.Disk')&#93;^^&#91;??(@.inputs.image == 'Windows Server 2022')&#93;.name<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #9CDCFE\">$<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">&#91;*&#93;.<\/span><span style=\"color: #9CDCFE\">resources<\/span><span style=\"color: #D4D4D4\">&#91;?(@.<\/span><span style=\"color: #9CDCFE\">type<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&#39;Cloud.vSphere.Disk&#39;<\/span><span style=\"color: #D4D4D4\">)&#93;^^&#91;??(@.<\/span><span style=\"color: #9CDCFE\">inputs<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">image<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&#39;Windows Server 2022&#39;<\/span><span style=\"color: #D4D4D4\">)&#93;.<\/span><span style=\"color: #9CDCFE\">name<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The query can be read as a pipeline:<\/p>\n\n\n\n<pre class=\"wp-block-code has-d-4-d-4-d-4-color has-text-color\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.039), 0.9rem);\"><code>$.content&#91;*]\n    \u2193\n.resources&#91;?(@.type == 'Cloud.vSphere.Disk')]\n    \u2193\n^^\n    \u2193\n&#91;??(@.inputs.image == 'Windows Server 2022')]\n    \u2193\n.name<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Step by step:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li class=\"has-medium-font-size\">Start with all deployments.<\/li>\n\n\n\n<li class=\"has-medium-font-size\">Inspect their resources and select <code>Cloud.vSphere.Disk<\/code> resources.<\/li>\n\n\n\n<li class=\"has-medium-font-size\">Move two path levels upward: from the resource to the <code>resources<\/code> array and<br>from there to the owning deployment.<\/li>\n\n\n\n<li class=\"has-medium-font-size\">Apply the self-filter to the deployment itself.<\/li>\n\n\n\n<li class=\"has-medium-font-size\">Keep only deployments using the <code>Windows Server 2022<\/code> image.<\/li>\n\n\n\n<li class=\"has-medium-font-size\">Return the deployment name.<\/li>\n<\/ol>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Result:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&#91;\"vm0004\"&#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #CE9178\">&quot;vm0004&quot;<\/span><span style=\"color: #D4D4D4\">&#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Conceptually, the traversal now looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-code has-d-4-d-4-d-4-color has-text-color\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.039), 0.9rem);\"><code>deployment\n    \u2502\n    \u2514\u2500\u2500 resources\n          \u2502\n          \u2514\u2500\u2500 matching disk\n                  \u2191\n                  \u2502 ^\n              resources\n                  \u2191\n                  \u2502 ^\n              deployment\n                  \u2502\n                  ?? image == \"Windows Server 2022\"\n                  \u2502\n                .name<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">This is what makes the combination interesting: the query does not have to<br>begin with the object that will eventually be returned.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">It can identify a deeply nested node first, move back to its owning context,<br>filter that context, and continue from there.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">For this particular example, the earlier RFC 9535 query is still the simpler<br>solution because the selection can naturally be expressed from the deployment<br>downward.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The bottom-up version is not intended to replace nested filters.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Its advantage becomes more apparent when the most natural starting point of a<br>query is located deep inside the object structure, especially when multiple<br>parent and self-filter steps need to be composed.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The extended operators can also reduce query complexity. Instead of expressing a deeply nested condition from the root downward, a query can start at the most specific node, traverse back to the relevant ancestor with <code>^<\/code>, and apply additional conditions there with <code>??(...)<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span id=\"bppb-heading-anchor-8\"><\/span>Using It in VCF\/Aria Orchestrator<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The implementation is provided as a single dependency-free Orchestrator Action.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Create an Action named <code>jsonPath<\/code> and use the contents of <code>jsonPath.js<\/code> from the GitHub repository as the Action body.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The Action expects three inputs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-medium-font-size\"><code>obj<\/code> \u2013 the JSON-compatible object to query<\/li>\n\n\n\n<li class=\"has-medium-font-size\"><code>expr<\/code> \u2013 the JSONPath expression<\/li>\n\n\n\n<li class=\"has-medium-font-size\"><code>arg<\/code> \u2013 optional query setting<br><br>Supported properties:<br>mode: &#8220;RFC9535&#8221; | &#8220;RFC9535_EXTENDED&#8221; | &#8220;GOESSNER_EXTENDED&#8221;<br>resultType: &#8220;VALUE&#8221; | &#8220;PATH&#8221;<br>allowUnsafeEval: true | false<br><br>Example:<br>{ mode: &#8220;RFC9535_EXTENDED&#8221;, resultType: &#8220;VALUE&#8221; }<br><br>Defaults:<br>mode = &#8220;RFC9535&#8221;<br>resultType = &#8220;VALUE&#8221;<br>allowUnsafeEval = false<\/li>\n<\/ul>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ac46c60b0014&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ac46c60b0014\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"509\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.visualdomain.ch\/wp-content\/uploads\/2026\/08\/jsonPath-1024x509.png\" alt=\"\" class=\"wp-image-237\" srcset=\"https:\/\/www.visualdomain.ch\/wp-content\/uploads\/2026\/08\/jsonPath-1024x509.png 1024w, https:\/\/www.visualdomain.ch\/wp-content\/uploads\/2026\/08\/jsonPath-300x149.png 300w, https:\/\/www.visualdomain.ch\/wp-content\/uploads\/2026\/08\/jsonPath-768x381.png 768w, https:\/\/www.visualdomain.ch\/wp-content\/uploads\/2026\/08\/jsonPath.png 1381w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">jsonPath Action<\/figcaption><\/figure>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>A typical call from a workflow looks like this:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Retrieve the deployments via the REST API and parse the response\n\/\/ Replace com.example.jsonpath with the module containing your jsonPath \nvar matches = System.getModule(\"com.example.jsonpath\").jsonPath(\n    deployments,\n    \"$.content&#91;?(@.inputs.image == 'Windows Server 2022')&#93;.name\"\n);<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Retrieve the deployments via the REST API and parse the response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Replace com.example.jsonpath with the module containing your jsonPath <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">matches<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">System<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getModule<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;com.example.jsonpath&quot;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">jsonPath<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">deployments<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;$.content&#91;?(@.inputs.image == &#39;Windows Server 2022&#39;)&#93;.name&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">RFC 9535 is the default query mode.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">RFC 9535 and value results are the defaults, so no options are required for standard queries. The extended mode is enabled explicitly only when features such as parent traversal or self-filtering are needed.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>var matches = System.getModule(\"com.example.jsonpath\").jsonPath(\n    deployments,\n    \"$.content&#91;*&#93;.resources&#91;?(@.type == 'Cloud.vSphere.Disk')&#93;^^&#91;??(@.inputs.image == 'Windows Server 2022')&#93;.name\",\n    {\n        mode: \"RFC9535_EXTENDED\"\n    }\n);<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">matches<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">System<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getModule<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;com.example.jsonpath&quot;<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">jsonPath<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">deployments<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&quot;$.content&#91;*&#93;.resources&#91;?(@.type == &#39;Cloud.vSphere.Disk&#39;)&#93;^^&#91;??(@.inputs.image == &#39;Windows Server 2022&#39;)&#93;.name&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">mode:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;RFC9535_EXTENDED&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">This keeps standard RFC 9535 queries as the default while making parent<br>traversal and self-filtering available when they are actually needed.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Supported modes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-medium-font-size\">RFC9535:\n<ul class=\"wp-block-list\">\n<li>Standard RFC 9535 behavior<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li class=\"has-medium-font-size\">RFC9535_EXTENDED:\n<ul class=\"wp-block-list\">\n<li>RFC 9535 + ^ + ??<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li class=\"has-medium-font-size\">GOESSNER_EXTENDED:\n<ul class=\"wp-block-list\">\n<li>Compatibility mode for historical Goessner-style queries<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">RFC 9535 is the built-in default, so standard queries do not require an <code>arg<\/code> parameter. The default mode can also be changed directly in the Action source by adjusting the <code>jsonPathMode<\/code> fallback (currently around line 3138 in <code>jsonPath.js<\/code>).<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>var jsonPathMode = arg &amp;&amp; arg.mode || \"RFC9535\";<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">jsonPathMode<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">arg<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">arg<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">mode<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #CE9178\">&quot;RFC9535&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">In larger environments, the default does not have to be hard-coded. It can instead be supplied dynamically through an Orchestrator Configuration Item. This makes it possible to define an environment-wide default while still allowing individual calls to override it through <code>arg.mode<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Compatibility and Origins<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">This implementation did not start from scratch.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Its historical basis is Stefan Goessner&#8217;s JSONPath 0.9.0 implementation from<br>2007, which has been used in many JavaScript environments for years.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The default query mode, however, follows the modern RFC 9535 JSONPath<br>specification.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The extended modes add two concepts used throughout this article:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"has-medium-font-size\"><code>^<\/code> \u2013 parent traversal, following the operator introduced by JSONPath Plus<\/li>\n\n\n\n<li class=\"has-medium-font-size\"><code>??(...)<\/code> \u2013 a self-filter specific to this implementation<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">JSONPath Plus is not a runtime dependency. The parent operator was adopted as a useful extension to the query model, while the self-filter was added to make it possible to evaluate the current node after navigating upward.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">This separation is intentional. Existing environments can preserve historical<br>query behavior where necessary, while new queries can use RFC 9535 as the<br>default.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Imperative traversal is not inherently wrong. For small object structures, a<br>few loops and conditions are often the simplest solution.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The problem starts when the traversal logic becomes more complex than the<br>business rule it is supposed to express.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Standard JSONPath already provides a strong declarative model for navigating<br>and filtering JSON structures from the top down. In many cases, including the<br>deployment example shown earlier, RFC 9535 is all that is needed.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The extended query model adds another direction when the natural starting point of a query is located deeper in the object structure.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The <code>^<\/code> parent operator makes it possible to navigate back toward an owning<br>object, while the <code>??(...)<\/code> self-filter makes it possible to evaluate the node<br>reached during that traversal.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Together, they allow queries to be composed as declarative bottom-up pipelines<br>instead of reconstructing the same relationships with nested loops, temporary<br>variables, and repeated property checks.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The goal is not to replace imperative code everywhere.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">It is to keep object traversal from dominating automation logic and to make the<br>selection itself visible in one place.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">For VCF\/Aria Orchestrator, where deeply nested API responses, deployment data, configuration structures, and inventory objects are common, that can make a significant difference in how readable and reusable automation code becomes.<\/p>\n\n\n\n<p class=\"is-style-default highlight-box ticss-62093dae has-accent-5-background-color has-background has-medium-font-size wp-block-paragraph\" style=\"border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--30)\">The complete implementation, supported syntax, query modes, examples, and test suite are available in the<a href=\"https:\/\/github.com\/viscop\/orchestrator-jsonpath-extended\" target=\"_blank\" rel=\"noreferrer noopener\"> GitHub repository<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span id=\"bppb-heading-anchor-11\"><\/span>AI Disclosure<\/h2>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">The JSONPath implementation discussed in this article was generated entirely using AI based on RFC 9535 and requirements and design decisions provided by the author. Project-specific tests were also AI-generated, while RFC 9535 compliance is additionally verified using the independent JSONPath Compliance Test Suite.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">AI was also used to assist with writing and editing this article. The final content was reviewed by the author.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Querying JSON in VCF Operations Orchestrator and VMware Aria Automation Orchestrator often starts simple. Find an object by name.Select an item from an array.Read a property somewhere below the root. For small structures, a few property accesses or loops are usually enough. But infrastructure data rarely stays simple. Configuration models, API responses, deployment metadata, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":246,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":28,"footnotes":""},"categories":[6,9],"tags":[],"class_list":["post-227","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aria-orchestrator","category-vcf-orchestrator"],"_links":{"self":[{"href":"https:\/\/www.visualdomain.ch\/index.php?rest_route=\/wp\/v2\/posts\/227","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.visualdomain.ch\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.visualdomain.ch\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.visualdomain.ch\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.visualdomain.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=227"}],"version-history":[{"count":18,"href":"https:\/\/www.visualdomain.ch\/index.php?rest_route=\/wp\/v2\/posts\/227\/revisions"}],"predecessor-version":[{"id":265,"href":"https:\/\/www.visualdomain.ch\/index.php?rest_route=\/wp\/v2\/posts\/227\/revisions\/265"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.visualdomain.ch\/index.php?rest_route=\/wp\/v2\/media\/246"}],"wp:attachment":[{"href":"https:\/\/www.visualdomain.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.visualdomain.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.visualdomain.ch\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}