Parse JSON Array where each member has different schema but same general structure

Pittsburgh DBA :

I have a JSON data feed coming into SQL Server 2016. One of the attributes I must parse contains a JSON array. Unfortunately, instead of implementing a key/value design, the source system sends each member of the array with a different attribute name. The attribute names are not known in advance, and are subject to change/volatility.

declare @json nvarchar(max) =
'{
    "objects": [
        {"foo":"fooValue"},
        {"bar":"barValue"},
        {"baz":"bazValue"}
    ]
}';

select * from openjson(json_query(@json, 'strict $.objects'));

As you can see:

  • element 0 has a "foo" attribute
  • element 1 has a "bar" attribute
  • element 2 has a "baz" attribute:
+-----+--------------------+------+
| key |       value        | type |
+-----+--------------------+------+
|   0 | {"foo":"fooValue"} |    5 |
|   1 | {"bar":"barValue"} |    5 |
|   2 | {"baz":"bazValue"} |    5 |
+-----+--------------------+------+

Ideally, I would like to parse and project the data like so:

+-----+---------------+----------------+------+
| key | attributeName | attributeValue | type |
+-----+---------------+----------------+------+
|   0 | foo           | fooValue       |    5 |
|   1 | bar           | barValue       |    5 |
|   2 | baz           | bazValue       |    5 |
+-----+---------------+----------------+------+

Reminder: The attribute names are not known in advance, and are subject to change/volatility.

lptr :
select o.[key], v.* --v.[key] as attributeName, v.value as attributeValue
from openjson(json_query(@json, 'strict $.objects')) as o
cross apply openjson(o.[value]) as v;

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=405510&siteId=1