使用 OPENJSON 跳过 OBJECTS 解析 JSON SQL

Posted

技术标签:

【中文标题】使用 OPENJSON 跳过 OBJECTS 解析 JSON SQL【英文标题】:Parse JSON SQL with OPENJSON skipping OBJECTS 【发布时间】:2020-08-11 17:43:26 【问题描述】:

我正在尝试在 Azure sql 中使用 OPENJSON 解析 json 文件,但我想在我的新表中进行特定映射。 我有一个 json 文件,其中包含许多 y0_1、y0_2、...y0_380。

    "proto": "01",
     "type": "A",

 "description": "heartbeat",
 "geometry": "y0_1": "tag": "Normal",
   "probability": 0.40,
   "x": 39,
   "y": 13,
  "y0_2": "tag": "category_3", "probability": 0.8, "x": 48, "y": 13,
  "y0_3": "tag": "Normal", "probability": 0.9, "x": 27, "y": 10,
"Test": "proba": 0.65

我想解析 json 并有一个具有这种格式的表: 我尝试使用 Openjson 格式解析 json,但我不知道如何像链接中的图片一样在同一列中获取所有 y 和 x

SELECT * from OPENROWSET (
        BULK 'sample.json',
        DATA_SOURCE ='dataset',
        FORMATFILE_DATA_SOURCE = 'myblobstorage',
        SINGLE_CLOB
        ) AS J
        CROSS APPLY OPENJSON (BulkColumn)
        WITH (
            proto nvarchar(100) N'$.proto',
            description nvarchar(100) N'$.description',
        
        )

table output desired

【问题讨论】:

【参考方案1】:

使用OPENJSONAS JSON 数据类型和CROSS APPLY 深入了解 JSON 的不同层。我创建了一个简化的示例来展示该技术:

DECLARE @json NVARCHAR(MAX) = '
  "proto": "01",
  "type": "A",
  "description": "heartbeat",
  "geometry": 
    "y0_1": 
      "tag": "Normal",
      "probability": 0.40,
      "x": 39,
      "y": 13
    ,
    "y0_2": 
      "tag": "category_3",
      "probability": 0.8,
      "x": 48,
      "y": 13
    ,
    "y0_3": 
      "tag": "Normal",
      "probability": 0.9,
      "x": 27,
      "y": 10
    ,
    "Test": 
      "proba": 0.65
    
  
'


SELECT
    j.proto,
    j.[type],
    j.[description],
    JSON_VALUE ( g.[value], '$.tag' ) AS tag,
    JSON_VALUE ( g.[value], '$.probability' ) AS probability,
    JSON_VALUE ( g.[value], '$.x' ) AS x,
    JSON_VALUE ( g.[value], '$.y' ) AS y

FROM OPENJSON( @json, '$' )
WITH (
    proto VARCHAR(50),
    [type] VARCHAR(50),
    [description] VARCHAR(50),
    [geometry] NVARCHAR(MAX) AS JSON
    ) j
    CROSS APPLY OPENJSON ( [geometry] ) g

我的结果:

【讨论】:

非常感谢,我进行了一些调整,但得到了想法并且奏效了。

以上是关于使用 OPENJSON 跳过 OBJECTS 解析 JSON SQL的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 OPENJSON 解析字符串

OPENJSON 从表中解析 3M 行很慢

使用 OPENJSON 将 JSON 数组解析为表

无法使用 OPENJSON 和 SQL Server 2017 解析具有动态键的对象数组

在存储过程中多次访问 OPENJSON 解析 JSON?

OPENJSON 在解析 JSON 属性时忽略大小写