SQL Server-具有显式架构的OPENJSON输出

时间:2018-11-17 13:26:14

标签: arrays json sql-server

我具有以下HTTP请求数组,格式为JSON

[
    {
        "Code":"856956645",
        "Type":"Colet",
        "MeasuredWeight":0.0,
        "VolumetricWeight":0.0,
        "ConfirmationName":null,
        "Observation":" 100 DE SFATURI OASELE",
        "ResponseCode":null,
        "Event":
            [   
                {
                    "Date":"2018-11-16T16:22:29.397",
                    "EventId":73,
                    "Description":"Ridicare din comanda client",
                    "LocalityName":"BUCURESTI"
                },
                {
                    "Date":"2018-11-17T08:55:06.14",
                    "EventId":5,
                    "Description":"Spre destinatar ",
                    "LocalityName":"BUCURESTI"
                }
            ]
    }
]

如何在第二组值中提取Description元素的值。我尝试过使用OPENJSON,但我做不到:

SELECT *
FROM OPENJSON(@json)
WITH (
            Description nvarchar(100) '$.Event.Description'
);

1 个答案:

答案 0 :(得分:0)

尝试嵌套。也不确定为什么您的尝试没有成功;除了玩耍之外,OPENJSON的用途还不多,但是,这可行:

SELECT J.Code, J.[Type], E.[Description]
FROM OPENJSON(@json)
WITH (Code bigint '$.Code',
      [Type] varchar(10) '$.Type',
      [Event] nvarchar(MAX) AS JSON) J
     CROSS APPLY OPENJSON([Event])
     WITH ([Description] varchar(100) '$.Description',
           EventID int '$.EventId') E
WHERE E.EventID = 5;

编辑:弄清为什么您的尝试不起作用的原因。您拥有的JSON在Event节点中有一个新的JSON对象,它们不仅仅是属性,例如在文档的第二个示例here中。实体被包裹在进一步的括号([])中,而不仅仅是括号({}),因此,为什么必须再次将下一层解析为单独的JSON对象。