如何用 TSQL 解析 JSON

How to parse JSON with TSQL

我之前在 TSQL 中做过一些基本的 JSON 解析,但我 运行 进行了一些更复杂的解析。

我试图解析的 JSON 对象中的实际字段是一个包含两个对象的数组。

例如:

{
"Channel":[],
"Account":[],
"OrderId": 4568,
"ParentAccount"null,
"Groups":[
{"Name":"List 1", "Include": false, "SalesDetails"[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2021", "End:"12/31/2021"}, 
"State":"NC"}]
},
{"Name":"List 2", "Include": true, "SalesDetails"[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2022", "End:"01/10/2022"}, 
"State":"SC"}]
}
],
"IsCustomer":true,
"ReferenceNumber": 554673
}

我想在 SQL 中做的是解析帐户、订单 ID,然后是组。有谁知道如何解析组数组中的多个对象?那是我没有的部分。

我的目标是生成一份报告,其中每个订单都在一行中。

order groups object 1 name groups object 2 name
4568 list 1 list 2

我正在尝试获取名称之间的其他值,例如 Include 并让 SalesDetail 成为它们自己的列。

到目前为止,以下内容让我最接近我所追求的:

SELECT
JSON_QUERY(data, '$.account') AS 'Account',
JSON_QUERY(data, '$.orderid') AS 'Order',
JSON_QUERY(data, '$.groups') AS 'Group_Detail'
FROM table

不过,我还没有将组字段中的信息解析到它们自己的单独列中。

假设我正确地修复了序列化问题,可能是这样的

declare @json       nvarchar(max)=N'{
"Channel":[],
"Account":[],
"OrderId": 4568,
"ParentAccount":null,
"Groups":[
{"Name":"List 1", "Include": false, "SalesDetails":[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2021", "End":"12/31/2021"}, 
"State":"NC"}]
},
{"Name":"List 2", "Include": true, "SalesDetails":[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2022", "End":"01/10/2022"}, 
"State":"SC"}]
}
],
"IsCustomer":true,
"ReferenceNumber": 554673
}';

select OrderId,
       grp1.[Name] [groups object 1 name],
       grp2.[Name] [groups object 2 name]
from openjson(@json) with (OrderId  int,
                           Groups   nvarchar(max) as json) oj
     cross apply openjson(oj.Groups, '$[0]') with ([Name]     nvarchar(4000)) grp1
     cross apply openjson(oj.Groups, '$[1]') with ([Name]     nvarchar(4000)) grp2;
OrderId groups object 1 name    groups object 2 name
4568    List 1                  List 2