Parse JSON Массив, где каждый элемент имеет разную схему, но общую структуру - PullRequest
1 голос
/ 04 апреля 2020

У меня есть JSON фид данных, поступающий на SQL Server 2016. Один из атрибутов, которые я должен проанализировать, содержит массив JSON. К сожалению, вместо реализации схемы ключ / значение исходная система отправляет каждому члену массива с другим именем атрибута. Имена атрибутов заранее неизвестны и могут изменяться / изменяться.

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

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

Как видно:

  • элемент 0 имеет Атрибут "foo"
  • элемент 1 имеет атрибут "bar"
  • элемент 2 имеет атрибут "baz":
+-----+--------------------+------+
| key |       value        | type |
+-----+--------------------+------+
|   0 | {"foo":"fooValue"} |    5 |
|   1 | {"bar":"barValue"} |    5 |
|   2 | {"baz":"bazValue"} |    5 |
+-----+--------------------+------+

В идеале хотелось бы чтобы проанализировать и спроецировать данные следующим образом:

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

Напоминание: Имена атрибутов заранее неизвестны и могут изменяться / изменяться.

1 Ответ

1 голос
/ 04 апреля 2020
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;
...