【问题标题】:How to parse JSON array string by using mssql?如何使用 mssql 解析 JSON 数组字符串?
【发布时间】:2019-03-04 10:38:37
【问题描述】:

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

    create function ParseJson(
    @json nvarchar(max))
returns @tempTable table (topKey nvarchar(max), [Key] nvarchar(max), [Value] nvarchar(max))
as
begin

    insert 
        @tempTable
    select 
        x.[key] topKey
        , y.[key] 
        , y.[value] 
    from openjson(@json) x
    cross apply openjson(x.[value]) y

    return

end

-- execute
select * from ParseJson(@json)

我定义了一个变量@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."
        }       
    ]
}'

然后我执行查询我会得到结果:

我希望我能得到下面的结果:

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

如何调整功能以满足预期?

【问题讨论】:

标签: json sql-server-2016


【解决方案1】:

如果我正确理解您的问题,下一个陈述是获得结果的一种可能方法。这是一个展示如何获取数组键和值的示例(我添加了额外的Something 键)。你需要的是一个额外的CROSS APPLY

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

SELECT 
   x.[key] topKey, 
   z.[key],
   z.[value]
FROM OPENJSON(@json) x
CROSS APPLY (SELECT * FROM OPENJSON(x.[value])) y
CROSS APPLY (SELECT * FROM OPENJSON(y.[value])) z

输出:

topKey  key         value
Chapter Section     1.1
Chapter Title       Hello world.
Chapter Something   Something value
Chapter Section     1.2
Chapter Title       Be happy.

更新:

如果你的 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

【讨论】:

  • 谢谢!但是如果我set @json = set @json = N'{ "Chapter":[ { "Section":"1.1", "Title":"Hello world.", "Something":"Something value" } , { "Section":"1.2", "Title":"Be happy." } ] , "Author":{ "name":"Annie" , "sex":"Female" } }' 我会收到错误消息:The JSON text format is incorrect. Unexpected character 'A' was found at position 0.
  • @Annie @Annie 是的,因为您有 ChapterAuthor 的 JSON 数组和 JSON 文本。如果是这种情况,ChapterAuthor 的方法必须不同。检查更新的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多