<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Get dynamic json property names in Getting Data In</title>
    <link>https://community.splunk.com/t5/Getting-Data-In/Get-dynamic-json-property-names/m-p/277990#M53273</link>
    <description>&lt;P&gt;I have some structured json logs that indicate some validation errors, and depending on the error, a different property is set with the value that caused the error. eg:&lt;/P&gt;

&lt;P&gt;&lt;CODE&gt;{ "validationError": { "property" : { "title"    : "" },                            "errorType" : "Empty" } }&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;{ "validationError": { "property" : { "category" : [] },                            "errorType" : "Empty" } }&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;{ "validationError": { "property" : { "category" : [ { "categoryId" : 12345  } ] }, "errorType" : "Invalid" } }&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;{ "validationError": { "property" : { "thing"    : { "thingId" : 9999 } },          "errorType" : "Disallowed" } }&lt;/CODE&gt;&lt;/P&gt;

&lt;P&gt;I would like to be able to retrieve the property name and its value: eg&lt;BR /&gt;
&lt;CODE&gt;property | value |    type&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;---------+-------+-----------&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;title |       | Empty&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;category |       | Empty&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;category | 12345 | Invalid&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;thing |  9999 | Disallowed&lt;/CODE&gt;&lt;/P&gt;</description>
    <pubDate>Fri, 22 Jul 2016 06:21:34 GMT</pubDate>
    <dc:creator>tmortiboy</dc:creator>
    <dc:date>2016-07-22T06:21:34Z</dc:date>
    <item>
      <title>Get dynamic json property names</title>
      <link>https://community.splunk.com/t5/Getting-Data-In/Get-dynamic-json-property-names/m-p/277990#M53273</link>
      <description>&lt;P&gt;I have some structured json logs that indicate some validation errors, and depending on the error, a different property is set with the value that caused the error. eg:&lt;/P&gt;

&lt;P&gt;&lt;CODE&gt;{ "validationError": { "property" : { "title"    : "" },                            "errorType" : "Empty" } }&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;{ "validationError": { "property" : { "category" : [] },                            "errorType" : "Empty" } }&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;{ "validationError": { "property" : { "category" : [ { "categoryId" : 12345  } ] }, "errorType" : "Invalid" } }&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;{ "validationError": { "property" : { "thing"    : { "thingId" : 9999 } },          "errorType" : "Disallowed" } }&lt;/CODE&gt;&lt;/P&gt;

&lt;P&gt;I would like to be able to retrieve the property name and its value: eg&lt;BR /&gt;
&lt;CODE&gt;property | value |    type&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;---------+-------+-----------&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;title |       | Empty&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;category |       | Empty&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;category | 12345 | Invalid&lt;/CODE&gt;&lt;BR /&gt;
&lt;CODE&gt;thing |  9999 | Disallowed&lt;/CODE&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 22 Jul 2016 06:21:34 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Getting-Data-In/Get-dynamic-json-property-names/m-p/277990#M53273</guid>
      <dc:creator>tmortiboy</dc:creator>
      <dc:date>2016-07-22T06:21:34Z</dc:date>
    </item>
    <item>
      <title>Re: Get dynamic json property names</title>
      <link>https://community.splunk.com/t5/Getting-Data-In/Get-dynamic-json-property-names/m-p/277991#M53274</link>
      <description>&lt;P&gt;So assuming your field is called yourField, I came up with the following (probably overcomplicated) query:&lt;/P&gt;

&lt;PRE&gt;&lt;CODE&gt;| rex max_match=0 "(?m)(?&amp;lt;yourField&amp;gt;[^\n]+)"
| fields - _raw
| mvexpand yourField
| spath input=yourField path=validationError.property output=propertyRaw
| spath input=yourField path=validationError.errorType output=type
| fields - yourField
| spath input=propertyRaw
| rex field=propertyRaw max_match=1 "(?msi)\"(?&amp;lt;property&amp;gt;[^\"]+)\"\s?:"
| fields - propertyRaw
| eval value = ""
| eval temp = 'category{}.categoryId'
| foreach * [ eval temp = if (match("&amp;lt;&amp;lt;FIELD&amp;gt;&amp;gt;", property), toString('&amp;lt;&amp;lt;FIELD&amp;gt;&amp;gt;'), "") | eval value = value . temp]
| fields property, value, type
| foreach * [ eval &amp;lt;&amp;lt;FIELD&amp;gt;&amp;gt; = if(match(&amp;lt;&amp;lt;FIELD&amp;gt;&amp;gt;, "Null"), null(), &amp;lt;&amp;lt;FIELD&amp;gt;&amp;gt;) ]
&lt;/CODE&gt;&lt;/PRE&gt;

&lt;P&gt;Example:&lt;/P&gt;

&lt;PRE&gt;&lt;CODE&gt;| stats count | fields - count
| eval _raw = "
{ \"validationError\": { \"property\" : { \"title\" : \"\" }, \"errorType\" : \"Empty\" } }
{ \"validationError\": { \"property\" : { \"category\" : [] }, \"errorType\" : \"Empty\" } }
{ \"validationError\": { \"property\" : { \"category\" : [ { \"categoryId\" : 12345 } ] }, \"errorType\" : \"Invalid\" } }
{ \"validationError\": { \"property\" : { \"thing\" : { \"thingId\" : 9999 } }, \"errorType\" : \"Disallowed\" } }
"
| rex max_match=0 "(?m)(?&amp;lt;yourField&amp;gt;[^\n]+)"
| fields - _raw
| mvexpand yourField
| spath input=yourField path=validationError.property output=propertyRaw
| spath input=yourField path=validationError.errorType output=type
| fields - yourField
| spath input=propertyRaw
| rex field=propertyRaw max_match=1 "(?msi)\"(?&amp;lt;property&amp;gt;[^\"]+)\"\s?:"
| fields - propertyRaw
| eval value = ""
| eval temp = 'category{}.categoryId'
| foreach * [ eval temp = if (match("&amp;lt;&amp;lt;FIELD&amp;gt;&amp;gt;", property), toString('&amp;lt;&amp;lt;FIELD&amp;gt;&amp;gt;'), "") | eval value = value . temp]
| fields property, value, type
| foreach * [ eval &amp;lt;&amp;lt;FIELD&amp;gt;&amp;gt; = if(match(&amp;lt;&amp;lt;FIELD&amp;gt;&amp;gt;, "Null"), null(), &amp;lt;&amp;lt;FIELD&amp;gt;&amp;gt;) ]
&lt;/CODE&gt;&lt;/PRE&gt;

&lt;P&gt;Output, see picture below:&lt;/P&gt;

&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="alt text"&gt;&lt;img src="https://community.splunk.com/t5/image/serverpage/image-id/1628i4D0F08F8507D1FAE/image-size/large?v=v2&amp;amp;px=999" role="button" title="alt text" alt="alt text" /&gt;&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 25 Jul 2016 10:17:24 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Getting-Data-In/Get-dynamic-json-property-names/m-p/277991#M53274</guid>
      <dc:creator>javiergn</dc:creator>
      <dc:date>2016-07-25T10:17:24Z</dc:date>
    </item>
  </channel>
</rss>

