簡體   English   中英

JSON SQL Server 2016 解析

[英]JSON SQL Server 2016 parse

我有一個嵌套的 JSON 作為表單的輸出,我需要解析它以便將它發送到連接表中。 我無法解析 JSON 中的一些數據:標簽、范圍值或正文 我得到 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

 ) 

輸出應該像

minRange maxRange rangeValues
0 10 1
0 10 2

身體序列

是 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM