json - 从 JSON SQL 查询中删除反斜杠
问题描述
我正在使用 SQL Server 查询构造 JSON 对象。我对斜线有疑问,而且我需要如下所述的特定格式的数据。实际输出中有斜线。我想从我的输出查询中消除斜杠。
SELECT (SELECT
('{'+'"value":'+ cast(ISNULL(SP.ACCOUNT_TRAFFIC_DEP_LICENSE_NUMBER,'') as varchar) ) AS TRAFFIC_DEP_LICENSE_NUMBER
,( '{' +'"value":'+cast(ISNULL(SP.NUMBER_OF_VEHICLES ,'') as varchar) ) AS NUMBER_OF_VEHICLES
,( '{' +'"value":'+cast(ISNULL(SP.ACCOUNT_TRAFFIC_DEP_LICENSE_START_H_DATE,'') as varchar) ) AS TRAFFIC_DEP_LICENSE_START_H_DATE
,( '{' +'"value":'+cast(ISNULL(SP.ACCOUNT_TRAFFIC_DEP_LICENSE_END_H_DATE ,'') as varchar) ) AS TRAFFIC_DEP_LICENSE_END_H_DATE
,( '{' +'"value":'+cast(ISNULL(SP.SUSPENSION_BY_MORROR_STATUS,'') as varchar) ) AS SUSPENSION_BY_MORROR_STATUS
,( '{' +'"value":'+cast(ISNULL(SP.SUSPENSION_BY_VIOLATION ,'') as varchar) ) AS SUSPENSION_BY_VIOLATION
,( '{' +'"value":'+cast(ISNULL(SP.SUSPENSION_BY_PENALTY ,'') as varchar) ) AS SUSPENSION_BY_PENALTY
from [dbo].[TAMM_CAC_ACCOUNTS_STG] SP
where SP.Account_Reference_Number = CAC.Account_Reference_Number
AND (
ACCOUNT_TRAFFIC_DEP_LICENSE_NUMBER IS NOT NULL OR
NUMBER_OF_VEHICLES IS NOT NULL OR
SP.ACCOUNT_TRAFFIC_DEP_LICENSE_END_H_DATE IS NOT NULL OR
SP.ACCOUNT_TRAFFIC_DEP_LICENSE_END_H_DATE IS NOT NULL OR
SP.SUSPENSION_BY_MORROR_STATUS IS NOT NULL OR
SP.SUSPENSION_BY_VIOLATION IS NOT NULL OR
SP.SUSPENSION_BY_PENALTY IS NOT NULL ) FOR JSON PATH,INCLUDE_NULL_VALUES
) AS specifics
from dbo.Customer_Account CAC
上面的查询给了我想要的输出,但它有反斜杠。
[
{
"TRAFFIC_DEP_LICENSE_NUMBER": "{\"value\":0",
"NUMBER_OF_VEHICLES": "{\"value\":1009",
"TRAFFIC_DEP_LICENSE_START_H_DATE": "{\"value\":14351229",
"TRAFFIC_DEP_LICENSE_END_H_DATE": "{\"value\":14351229",
"SUSPENSION_BY_MORROR_STATUS": "{\"value\":0",
"SUSPENSION_BY_VIOLATION": "{\"value\":1",
"SUSPENSION_BY_PENALTY": "{\"value\":1"
}
]
实际预期输出低于
“specific”:{
"TRAFFIC_DEP_LICENSE_NUMBER":{“value”:0},
"NUMBER_OF_VEHICLES":{“value”:22},
"TRAFFIC_DEP_LICENSE_START_H_DATE":{“value”: 14480608},
"TRAFFIC_DEP_LICENSE_END_H_DATE":{“value”: 14480608},
"SUSPENSION_BY_MORROR_STATUS":{“value”:0},
"SUSPENSION_BY_VIOLATION":{“value”:1},
"SUSPENSION_BY_PENALTY":{“value”:1},
}
解决方案
如果我正确理解了您的问题,并且您想删除特殊字符的转义以生成有效的 JSON 内容,那么下一个解决方案可能会有所帮助。
FOR JSON
子句使用 .转义JSON
输出中的特殊字符\
。
... 如果源数据包含特殊字符,FOR JSON 子句在 JSON 输出中使用 \ 对它们进行转义,如下表所示。这种转义发生在属性名称和它们的值中。...
如果您确定生成了一个有效的JSON
,您可以尝试将JSON_QUERY 与 FOR JSON一起使用。
... JSON_QUERY 返回一个有效的 JSON 片段。因此,FOR JSON 不会转义 JSON_QUERY 返回值中的特殊字符。...
简单的例子,说明你的问题:
-- Statement:
SELECT (
SELECT '{"value": 1}' AS TRAFFIC_DEP_LICENSE_NUMBER
FOR JSON PATH, INCLUDE_NULL_VALUES
) AS specifics
-- Output:
-------------------------------------------------
specifics
-------------------------------------------------
[{"TRAFFIC_DEP_LICENSE_NUMBER":"{\"value\": 1}"}]
解决方案:
-- Statement:
SELECT (
SELECT JSON_QUERY('{"value": 1}') AS TRAFFIC_DEP_LICENSE_NUMBER
FOR JSON PATH, INCLUDE_NULL_VALUES
) AS specifics
-- Output:
-------------------------------------------------
specifics
-------------------------------------------------
[{"TRAFFIC_DEP_LICENSE_NUMBER":{"value": 1}}]
笔记:
您可以使用ISJSON检查您的 JSON :
SELECT (
SELECT CASE
WHEN ISJSON('{"value": 1}') = 1 THEN JSON_QUERY('{"value": 1}')
ELSE 'Invalid JSON'
END AS TRAFFIC_DEP_LICENSE_NUMBER
FOR JSON PATH, INCLUDE_NULL_VALUES
) AS specifics
推荐阅读
- github - 如何在不发送拉取请求的情况下在我的程序中实现在分叉的 Git 存储库中所做的更改?
- r - 在 R 中,分类模型中的弹性网络缺失类
- php - 我有一个数组,我想在页面刷新时随机生成
- arrays - 将相同的数据传递给Scala中的两个或多个方法
- java - 为什么我在 ~/.android 文件夹中没有 debug.keystore(对于 mac)?
- javascript - Html 和 Javascript:如何返回用户输入
- javascript - Sinonjs存根不替换方法
- javascript - JavaScript 类型转换 ==
- python - 如何向此 reddit 机器人代码添加更多子版块/关键字?
- json - 在没有 perl 的情况下使用 sed、grep 或 awk 来复制正向回溯