JSON SQL 服务器 2016 解析

JSON SQL Server 2016 parse

我有一个嵌套的 JSON 作为表单的输出,我需要解析它以便将它发送到连接表中。我无法解析 JSON 中的某些数据:标签、范围值或 body 我得到 NULL 有人遇到过这种类型吗?

    DECLARE @json NVARCHAR(MAX)
SET @json = '{
   "Id":"712db489",
   "label":"kjk",
   "ranges":{
      "rangeQuestion":null,
      "minRange":0,
      "maxRange":10,
      "rangeValues":[1,2],
      "hasMarks":false
   },
   "labels":[1,2],
   "options":[
      {
         "body":"Yes",
         "sequence":1
      },
      {
         "body":"No",
         "sequence":2
      }
   ]
}'

SELECT * FROM  
 OPENJSON ( @json )  
WITH (   
              label   nvarchar(250), --ok
              maxRange   nvarchar(250) '$.ranges.maxRange', --ok
              labels   nvarchar(250), -- not parsed
              rangesValues nvarchar(250) '$.ranges.rangeValues' , -- not parsed
              body   nvarchar(250) '$.options.body' -- not parsed

 ) 

输出应该像

最小范围最大范围范围值
0 10 1
0 10 2

body 序列

是 1

没有 2

嵌套3层可以做什么?

DECLARE @json NVARCHAR(MAX)

SET @json = '{
   "Id":"712db489",
   "label":"kjk",
   "ranges":{
      "rangeQuestion":null,
      "minRange":0,
      "maxRange":10,
      "rangeValues": [
                {
                    "rangeValue": 1,
                    "otherValue": 10
                },
                {
                    "rangeValue": 2,
                    "otherValue": 20
                }
            ],
      "hasMarks":false
   },
   "labels":[1,2],
   "options":[
      {
         "body":"Yes",
         "sequence":1
      },
      {
         "body":"No",
         "sequence":2
      }
   ]
}'

SELECT r.minRange,
       r.maxRange,
       rV.[value] AS rangeValue
FROM OPENJSON (@json, '$.ranges')  
     WITH (minRange int,
           maxRange int,
           rangeValues nvarchar(MAX) 
           AS JSON) r
     CROSS APPLY OPENJSON (r.rangeValues) rV;

看来,从评论里的讨论来看,你真正追求的是:

SELECT r.minRange,
       r.maxRange,
       rV.[value] AS rangeValue
FROM OPENJSON (@json, '$.ranges')  
     WITH (minRange int,
           maxRange int,
           rangeValues nvarchar(MAX) AS JSON) r
     CROSS APPLY OPENJSON (r.rangeValues) rV;

SELECT *
FROM OPENJSON (@json,'$.options')
     WITH (body varchar(3),
           sequence int) o;

我解决的第二个问题

DECLARE @json NVARCHAR(MAX)

SET @json = '{
   "Id":"712db489",
   "label":"kjk",
   "ranges":{
      "rangeQuestion":null,
      "minRange":0,
      "maxRange":10,
      "rangeValues": [
                {
                    "rangeValue": 1,
                    "otherValue": 10
                },
                {
                    "rangeValue": 2,
                    "otherValue": 20
                }
            ],
      "hasMarks":false
   },
   "labels":[1,2],
   "options":[
      {
         "body":"Yes",
         "sequence":1
      },
      {
         "body":"No",
         "sequence":2
      }
   ]
}'

SELECT ranges.minRange as minRange,
       ranges.maxRange as maxRange,
       rangeValues.rangeValue AS rangeValue
FROM OPENJSON (@json, '$.ranges')  
WITH (minRange int,
    maxRange int,
    rangeValues nvarchar(MAX) AS JSON
    ) as ranges
CROSS APPLY OPENJSON (ranges.rangeValues) 
with (
rangeValue int ,
otherValue int
)as rangeValues;