json - Sql Server OPENJSON 返回 unicode 字符串
问题描述
我对 SQL Server 和 JSON 有疑问:/
有很多来自远程数据库的 JSON 字符串(我只有读取权限)。问题是它们都被解析成 unicodes 而我不知道如何把它们变成 UTF-8 !
以这个 JSON 为例:
{
"0":{
"id":1,
"name":"\\u062a\\u0646"
},
"1":{
"id":2,
"name":"\\u0628\\u0633\\u062a\\u0647 10\\u062a\\u0627\\u06cc\\u06cc"
},
"2":{
"id":3,
"name":"\\u0639\\u062f\\u062f 10\\u062a\\u0627\\u06cc\\u06cc"
},
"5":{
"id":6,
"name":"\\u0639\\u062f\\u062f 1000\\u062a\\u0627\\u06cc\\u06cc"
},
"6":{
"id":7,
"name":"\\u06a9\\u06cc\\u0644\\u0648\\u06af\\u0631\\u0645"
}
}
如您所见,字段name
被解析为 unicode。我这样做是为了将数据提取到表中:
SELECT Units.*
FROM OPENJSON(@Json) AS i
CROSS APPLY OPENJSON(i.[value]) WITH (
[Id] INT '$.id',
[Name] NVARCHAR(MAX) '$.name'
) AS Units
然后它会显示如下结果:
- 编号:1,名称:\u062a\u0646
- 编号:2,名称:\u0628\u0633\u062a\u0647 10\u062a\u0627\u06cc\u06cc
- ...
但我需要这样的结果:
- ID : 1,姓名: تن
- 编号:2,姓名:عدد 10تایی
- ...
解决方案
来自 ECMA-404 标准的一些解释:JSON 字符串是用引号 (U+0022) 包裹的 Unicode 代码点序列。... 如果代码点位于基本多语言平面(U+0000 到 U+FFFF),那么它可以表示为六个字符的序列:一个反斜线,后跟小写字母 u,后跟四个十六进制编码代码点的数字。
似乎名称已转义,因此可能的选择是替换转义的\
:
JSON:
DECLARE @json nvarchar(max) = N'{
"0":{
"id":1,
"name":"\\u062a\\u0646"
},
"1":{
"id":2,
"name":"\\u0628\\u0633\\u062a\\u0647 10\\u062a\\u0627\\u06cc\\u06cc"
},
"2":{
"id":3,
"name":"\\u0639\\u062f\\u062f 10\\u062a\\u0627\\u06cc\\u06cc"
},
"5":{
"id":6,
"name":"\\u0639\\u062f\\u062f 1000\\u062a\\u0627\\u06cc\\u06cc"
},
"6":{
"id":7,
"name":"\\u06a9\\u06cc\\u0644\\u0648\\u06af\\u0631\\u0645"
}
}'
陈述:
SELECT Units.*
FROM OPENJSON(REPLACE(@Json, N'\\u', N'\u')) AS i
CROSS APPLY OPENJSON(i.[value]) WITH (
[Id] INT '$.id',
[Name] NVARCHAR(MAX) '$.name'
) AS Units
结果:
Id Name
1 تن
2 بسته 10تایی
3 عدد 10تایی
6 عدد 1000تایی
7 کیلوگرم
推荐阅读
- amazon-web-services - AWS Cloudformation:ECS 任务定义 ARN
- git - 无法在 github 上推或拉
- javascript - 如何让按钮进行数学运算,然后使用 JS 显示它?
- asp.net-core - 将 Enum 转换为 SelectList 的 ASP.NET Core 扩展方法
- java - 变量适配器可能尚未初始化错误
- c# - 任意 C# 类的反序列化
- python - 非线性 ODE 求解器
- c# - 无法从文件动态编译代码,因为找不到命名空间“MySql”
- java - 制作程序以将数组中的所有数字相加
- bash - make 不支持反引号吗?