【问题标题】:Select for JSON return array of string arrays (not array of objects)选择 JSON 返回字符串数组数组(不是对象数组)
【发布时间】:2020-09-03 18:59:37
【问题描述】:

我有一个格式化为 JSON 返回的查询。它返回一个对象数组。

select id, name from [user] 
for JSON auto

这是它返回的对象数组

[{
        "id": "0FDF9BCA-1E41-4DA6-B892-0017DE395754",
        "name": "I Accept Answers"
    }, {
        "id": "3E775870-D97A-4B23-B761-00382D932704",
        "name": "Heywood Youhelpme"
    },{
        "id": "4E775870-D97A-4B23-B761-00382D932704",
        "name": "Geeimiss Xml"
    }
 ]

但是,在大型同质数据集中,对象名称是多余的。我只想要数据(没有对象名称)。

[
    [
        "0FDF9BCA-1E41-4DA6-B892-0017DE395754",
        "I Accept Answers"
    ],
    [
        "3E775870-D97A-4B23-B761-00382D932704",
        "Heywood Youhelpme"
    ],
    [
        "4E775870-D97A-4B23-B761-00382D932704",
        "Geeimiss Xml"
    ]
]

我希望将此作为 AJAX 响应提供给浏览器端 DataTables.js 显示。

我已经看到了几个“真正”混乱的解决方案,这些解决方案确实搞砸了查询,我希望在“for JSON”指令中有一些“as array”选项或类似的选项。无需对每个参数进行特殊说明。

【问题讨论】:

  • Microsoft SQL Server 2017 (RTM-CU5) (KB4092643) - 14.0.3023.8 (X64) 2018 年 3 月 2 日 18:24:44 版权所有 (C) 2017 Microsoft Corporation Web Edition (64-bit) o​​n Windows Server 2016 Datacenter 10.0 (内部版本 14393:)(管理程序)

标签: c# json sql-server datatables


【解决方案1】:

所以,您正在请求一个 javascript 解决方案。如果是这样,您可以像这样使用Object.values

var json = '[{"id": "0FDF9BCA-1E41-4DA6-B892-0017DE395754","name": "I Accept Answers"}, {"id": "3E775870-D97A-4B23-B761-00382D932704","name": "Heywood Youhelpme"},{"id": "4E775870-D97A-4B23-B761-00382D932704","name": "Geeimiss Xml"} ]';
var obj = JSON.parse(json);
var values = Object.keys(obj).map(function (key) { return  Object.values(obj[key]); });
console.log(JSON.stringify(values));

如果您需要 SQL Server 2017 解决方案,FOR JSON 将始终返回 JSON 对象,因此要拥有数组,您需要手动创建它:

SELECT RESULT = '[' + STRING_AGG( ISNULL('[ "' + id + '","'+ Name '" ]', ''), ',') + ']'
FROM 
    [user] 

【讨论】:

  • 对不起,没有。我正在寻找一个 SQL 解决方案。我试图将我想要的数据发送到浏览器,而不是在浏览器中修复它。
  • @WilliamWalseth 我已经用 SQL 解决方案更新了我的答案。
  • 感谢 iSR5,但@JSON 来自哪里?我从一个 SQL 查询开始,并想用它构建一个数组数组的 JSON。 SQL 已经构建了对象数组,这也是您正在构建的。我有几十个现有的查询要更改,所以我不能用这个字符串操作重新构建它们。
  • @WilliamWalseth @JSON 是您当前的 json 结果(已使用 select id, name from [user] for JSON auto 从表中转换,并且上述查询的结果将返回对象值数组(在这种情况下,我m 只返回 name 值作为数组)。
  • @WilliamWalseth 对不起,我再次更新了我的答案,这次我删除了以前的解决方案,因为您不需要使用 FOR JSON 来返回数组数组,而 SQL Server 将只返回对象。所以在STRING_AGG 的帮助下直接选择就可以了。
【解决方案2】:

你可以试试下面这样的查询,它使用QUOTENAMESTRING_AGG串联的tsql函数

select  
    '[' + 
       STRING_AGG(CAST(QUOTENAME(QUOTENAME(id,'"')+','+QUOTENAME(name,'"')) AS NVARCHAR(MAX)),',')
      +']' 
from [user]

这也会起作用

select  '['+
STRING_AGG(CAST(CONCAT('["', id ,'","' , name,'"]') AS NVARCHAR(MAX)),',')
+']' from [user]

如果您需要 JSON 输出的包装器,您可能想试试这个

SELECT REPLACE(REPLACE(REPLACE((select id, name from [user] 
for JSON auto),'[{','[['),'}]',']]'),'},{','],[')

【讨论】:

  • 谢谢,但我真的想避免这种需要更改整个查询的混乱解决方案。
  • @WilliamWalseth 你需要一个演员表。更新查询 1
  • Dhruv,感谢您是字符串处理方面的真正专家,能够如此迅速地提出这些问题,但这确实不是我希望的方向。 MSSQL 是否通过某种选项本机支持这一点?
  • @WilliamWalseth 我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 2013-03-30
  • 2019-10-05
  • 1970-01-01
  • 2018-08-12
相关资源
最近更新 更多