首页 > 解决方案 > 关于使用 OPENJSON 解析嵌套数组的建议

问题描述

我希望有人可以帮助我指出正确的方向,因为我正在尝试使用 OPENJSON 将 json 文件解析为 sql。我有一个看起来像这样的结构:

DECLARE @json AS NVARCHAR(MAX) = '

[{
        "id": "78",
        "Version": {
            "Value": "12"
        },

        "Names": [{
                "NameId": {
                    "Value": "8516365"
                },
                "id": "328787",
                "NameLinkType": {
                    "Value": "A"

                    "CommsChains": {
                        "Value": [[{
                                    "com_primary": {
                                        "Value": "Y"
                                    },
                                    "com_recd": {
                                        "Value": "2020-07-07 00:00:00.000"
                                    },
                                    "com_ack": {
                                        "Value": "2020-07-09 00:00:00.000"

                                    },
                                }
                            ]]
                ),  },
            },
                    
        ],
        
    }
]'

我能够正确解析大部分 JSON,因此对于每个 ID,我都可以返回诸如Versionor之类的值NameId。但是,我无法返回关于com_recdor的任何日期com_ack,它们位于 CommsChains [Object] – Value [Array] – [0] [Array] 下

在此处输入图像描述

标签: sqlarraysnested

解决方案


您的 JSON 中似乎存在一些语法错误。在修复它们之后,我能够尝试找到日期表达式到日期值的 JSON 路径。这是 SQL:

DECLARE @json AS NVARCHAR(MAX) = '
[{
        "id": "78",
        "Version": {
            "Value": "12"
        },

        "Names": [{
                "NameId": {
                    "Value": "8516365"
                },
                "id": "328787",
                "NameLinkType": {
                    "Value": "A",

                    "CommsChains": {
                        "Value": [[{
                                    "com_primary": {
                                        "Value": "Y"
                                    },
                                    "com_recd": {
                                        "Value": "2020-07-07 00:00:00.000"
                                    },
                                    "com_ack": {
                                        "Value": "2020-07-09 00:00:00.000"

                                    }
                                }
                            ]]
                    }
                }
            }
                    
        ]
        
    }
]'
select * from openjson(@json, '$[0].Version');--Value 12 1
select * from openjson(@json, '$[0].Names');
select * from openjson(@json, '$[0].Names[0]');
select * from openjson(@json, '$[0].Names[0].NameLinkType');
select * from openjson(@json, '$[0].Names[0].NameLinkType.CommsChains');
select * from openjson(@json, '$[0].Names[0].NameLinkType.CommsChains.Value');
select * from openjson(@json, '$[0].Names[0].NameLinkType.CommsChains.Value[0]');
select * from openjson(@json, '$[0].Names[0].NameLinkType.CommsChains.Value[0][0]');

select * from openjson(@json, '$[0].Names[0].NameLinkType.CommsChains.Value[0][0].com_recd'); --selecting path for com_recd
select * from openjson(@json, '$[0].Names[0].NameLinkType.CommsChains.Value[0][0].com_ack');  --selecting path for com_ack

在这里,我展示了对 JSON 不同部分的选择。数组的内容总是被引用为[0]它总是在这里选择的第一个索引。

有关 SQL 服务器上 JSON 路径的更多信息,请查看此处


推荐阅读