【问题标题】:SQL generate JSON without square bracketsSQL 生成不带方括号的 JSON
【发布时间】:2019-10-31 03:41:07
【问题描述】:

我有这个问题:

SELECT 
    'Ball' AS title, 'Blue' AS color, 
    (SELECT '1' AS Opt1, '2' AS Opt2 
     FOR JSON PATH) AS 'Options'
FOR JSON PATH, ROOT('product')

我得到了这个非常好的 JSON,但在 product(标记)之后我不能有括号

{"product": 
[  <======
{
 "title": "Ball",
 "color": "Blue",
 "Options": [{"Opt1": "1","Opt2": "2"}]
}
]  <======
}

换句话说,我需要这个:

{"product": 
{
 "title": "Ball",
 "color": "Blue",
 "Options": [{"Opt1": "1","Opt2": "2"}]
}
}

我不能使用WITHOUT_ARRAY_WRAPPER 选项,因为我已经使用了ROOT 选项。 我应该怎么做才能删除这些方括号?

【问题讨论】:

    标签: json sql-server tsql sql-server-2016


    【解决方案1】:

    非常接近 Greg Low 的答案,但用 json_query 包裹内部选择以避免自动转义(这是因为使用了选项 without_array_wrapper):

    SELECT JSON_QUERY((
        SELECT 'Ball' AS title, 
               'Blue' AS color, (
                    select '1' AS Opt1, 
                           '2' AS Opt2 
                    FOR JSON PATH
               ) as Options
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        )) AS Product
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
    

    这会给你想要的结果 -

    {
      "Product": {
        "title": "Ball",
        "color": "Blue",
        "Options": [
          {
            "Opt1": "1",
            "Opt2": "2"
          }
        ]
      }
    }
    

    【讨论】:

    • 为什么第一个 SELECT 后必须有双括号?
    • 一个属于json_query函数,另一个封装了select语句,也就是说select语句返回的值作为json_query函数的参数。如果没有内括号,您将收到语法错误。
    【解决方案2】:

    这就是你所追求的吗?

    SELECT (SELECT 'Ball' AS title, 
                   'Blue' AS color, 
                   (select '1' AS Opt1, '2' AS Opt2 FOR JSON PATH) as 'Options'
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) AS Product
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
    

    【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多