Sql-Server
使用 SELECT FOR JSON 生成包含點的屬性名稱的 JSON
我需要從 SQL Server 中的表生成以下 JSON 有效負載(縮短)。請注意屬性名稱中的點。這是一種稱為 OData 的特殊語法。
{ "Id" : "A1", "value": { "createdonbehalfby@odata.bind": "systemusers(key='AAAA12334')" } }
想像一下表格如下:
我嘗試了以下 T-SQL 命令:
SELECT [Id], [CreatedBy] AS [value.createdonbehalfby@odata.bind] FROM [Account] FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
這顯然會導致:
{ "Id" : "A1", "value": { "createdonbehalfby@odata": { "bind": "systemusers(key='AAAA12334')" } } }
我已經徹底閱讀了有關 SQL Server 中 JSON 功能的完整文件,並且在文件中沒有描述屬性名稱中的轉義點。
您可以使用
FOR JSON AUTO
which 忽略.
鍵中的字元。這種情況下需要放在子查詢中,否則無法獲取
value
keySELECT [Id], JSON_QUERY(( SELECT [CreatedBy] AS [createdonbehalfby@odata.bind] FROM (VALUES(1)) v(dummy) -- because AUTO needs at least one table FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER )) AS value FROM [Account] FOR JSON PATH, WITHOUT_ARRAY_WRAPPER```
一種解決方案(除了我的其他答案)是在您希望生成的 JSON 結構中更加明確。基本上,您在這里為 FOR JSON 提供了一些已經正確解析的 JSON 程式碼。
SELECT [Id], JSON_QUERY('{"createdonbehalfby@odata.bind":"'+CreatedBy+'"}') as value FROM (SELECT 'A1' as ID, 'AAAA12334' as CreatedBy) AS account FOR JSON PATH , without_array_wrapper