How to parse nested JSON array using SQL Server

后端 未结 2 1553
孤城傲影
孤城傲影 2021-02-13 11:02

I am currently able to parse most of a JSON file using SQL Server\'s \"OPENJSON WITH (...\" syntax. However, this particular file contains nested arrays which I do not know how

相关标签:
2条回答
  • 2021-02-13 11:22

    After MUCH searching I finally discovered the answer to this issue. I simply have to include the Nested Array as another JSON column in my query, like:

    WITH
     (DOC_ID                varchar(100)  '$.doc._id',
      DOC_REV               varchar(45)   '$.doc._rev',
      DELY_APPL_NAME        varchar(20)   '$.doc.delivery.application',
      DELY_SENT_BY          varchar(25)   '$.doc.delivery.sender.id',
      DELY_SENT_TYPO        varchar(20)   '$.doc.delivery.sender.type',
      RECIPS                nvarchar(max) '$.doc.delivery.recipients' as JSON,
      PAYLOAD_START_TIME    varchar(30)   '$.doc.payload.startTS',
      ....
      ...
      ..
      ) as my_query
    

    So, I end up with one record per JSON document, with (in this case) a varchar column containing JSON text.

    Next, I can run a separate query on this column to parse the JSON and create a "child table" associated with the Parent.

    0 讨论(0)
  • 2021-02-13 11:37

    I just had the same problem, and I ended up solving it with multiple CROSS APPLY clauses.

    Here's an example of my JSON:

    DECLARE @PermsJSON NVARCHAR(MAX) =
    N'[{
        "AppId": 1,
        "Perms":
        [{
    
            "Permission": ["AA", "BB"],
            "PermissionTypeID": 2
        },
        {
            "Permission": ["10"],
            "PermissionTypeID": 1
        }]
    },
    {
        "AppId": 2,
        "Perms":
        [{
    
            "Permission": ["IM", "NM"],
            "PermissionTypeID": 2
        },
        {
            "Permission": ["42"],
            "PermissionTypeID": 1
        }]
    }]';
    

    And then I can parse it using the following query:

    SELECT
        a.AppId
        ,[Permission] = c.Value
        ,b.PermissionTypeID
    FROM
        OPENJSON(@PermsJSON)
        WITH
            (
                AppId INT N'$.AppId'
                ,Perms NVARCHAR(MAX) AS JSON
            ) AS a
    CROSS APPLY
        OPENJSON(a.Perms)
        WITH
            (
                PermissionTypeID INT
                ,[Permission] NVARCHAR(MAX) AS JSON
            ) AS b
    CROSS APPLY OPENJSON(b.Permission) AS c;
    

    The results then look like this:

    AppId   Permission  PermissionTypeID
    1       AA          2
    1       BB          2
    1       10          1
    2       IM          2
    2       NM          2
    2       42          1
    
    0 讨论(0)
提交回复
热议问题