如何使用mssql解析JSON数组字符串?

如何使用mssql解析JSON数组字符串?,json,sql-server-2016,Json,Sql Server 2016,我已经在下面创建了ParseJson函数: 我定义了一个变量@json,它不是数组字符串: set @json = N'{ "Chapter": { "Section":"1.1" , "Title":"Hello world." } }' 然后执行查询,我将得到结果: 如果我重置变量@json,它是一个数组字符串: declare @json nvarchar(max) set @json = N'{ "Chapter":[ {

我已经在下面创建了ParseJson函数:

我定义了一个变量@json,它不是数组字符串:

set @json = 
N'{
  "Chapter":
  {
      "Section":"1.1"
      , "Title":"Hello world."
  }
}'
然后执行查询,我将得到结果:

如果我重置变量@json,它是一个数组字符串:

declare @json nvarchar(max)
set @json = 
N'{
  "Chapter":[
        {
            "Section":"1.1"
            , "Title":"Hello world."
        }
        ,
        {
            "Section":"1.2"
            , "Title":"Be happy."
        }       
    ]
}'
然后执行查询,我将得到结果:

我希望我能得到以下结果:

我不知道我期望的结果是否合理


如何调整函数以满足期望值?

如果我正确理解了您的问题,下一个语句是获得结果的一种可能方法。这是一个演示如何获取数组键和值的示例,我在其中添加了一些额外的键。你需要的是一个额外的交叉申请

输出:

topKey  key         value
Chapter Section     1.1
Chapter Title       Hello world.
Chapter Something   Something value
Chapter Section     1.2
Chapter Title       Be happy.
topKey  Key         Value
Chapter Section     1.1
Chapter Title       Hello world.
Chapter Something   Something value
Chapter Section     1.2
Chapter Title       Be happy.
Author  name        Annie
Author  sex         Female
更新:

如果您的JSON具有不同类型的嵌套对象,则方法将不同:

DECLARE @json nvarchar(max)
set @json = N'{ 
   "Chapter": [ 
       {
       "Section":"1.1", 
       "Title":"Hello world.", 
       "Something":"Something value"
       }, 
       {
       "Section":"1.2", 
       "Title":"Be happy." 
       }
   ], 
   "Author": { "name":"Annie" , "sex":"Female" } 
}'

SELECT 
   x.[key] topKey,
   z.[key] [Key],
   z.[value] AS [Value]
FROM OPENJSON(@json) x
CROSS APPLY (SELECT * FROM OPENJSON(x.[value])) y
CROSS APPLY (SELECT * FROM OPENJSON(y.[value])) z
WHERE y.[type] = 5
UNION ALL
SELECT 
   x.[key] topKey,
   y.[key] [Key],
   y.[value] AS [Value]
FROM OPENJSON(@json) x
CROSS APPLY (SELECT * FROM OPENJSON(x.[value])) y
WHERE y.[type] <> 5

请问您的SQL Server版本是什么?如果你的版本比2016年更高,请查看Those帖子:;可能的重复虽然您可以尝试在通用函数中捕获逻辑,但最终会得到一堆特殊的大小写,用于在解析之前检查结构,这使得它毕竟不是通用的。在每个查询中单独解析JSON更有意义,具体取决于需要什么,例如,SELECT*FROMOPENJSON@json,“$.Chapter”,第NVARCHAR100节,标题NVARCHAR100,适用于单例和数组情况。谢谢!但是如果我设置@json=set@json=N{章节:[{章节:1.1,标题:你好世界,某物:某物价值},{章节:1.2,标题:快乐}],作者:{姓名:安妮,性别:女性}'我将收到错误消息:JSON文本格式不正确。在位置0处发现意外字符“A”。@Annie@Annie是的,因为您有用于章节和作者的JSON数组和JSON文本。如果这是您的情况,则章节和作者的方法必须不同。检查更新的答案。
DECLARE @json nvarchar(max)
set @json = N'{ 
   "Chapter": [ 
       {
       "Section":"1.1", 
       "Title":"Hello world.", 
       "Something":"Something value"
       }, 
       {
       "Section":"1.2", 
       "Title":"Be happy." 
       }
   ], 
   "Author": { "name":"Annie" , "sex":"Female" } 
}'

SELECT 
   x.[key] topKey,
   z.[key] [Key],
   z.[value] AS [Value]
FROM OPENJSON(@json) x
CROSS APPLY (SELECT * FROM OPENJSON(x.[value])) y
CROSS APPLY (SELECT * FROM OPENJSON(y.[value])) z
WHERE y.[type] = 5
UNION ALL
SELECT 
   x.[key] topKey,
   y.[key] [Key],
   y.[value] AS [Value]
FROM OPENJSON(@json) x
CROSS APPLY (SELECT * FROM OPENJSON(x.[value])) y
WHERE y.[type] <> 5
topKey  Key         Value
Chapter Section     1.1
Chapter Title       Hello world.
Chapter Something   Something value
Chapter Section     1.2
Chapter Title       Be happy.
Author  name        Annie
Author  sex         Female