如果对象名称包含单引号,如何选择 JSON_VALUE?

dme*_*han 1 sql-server json sql-server-2016-express

我正在尝试从表中的某些 JSON 中获取值。这是我的查询:

Select JSON_VALUE(JSON_Data, '$.Person's_ID') FROM Table 
Run Code Online (Sandbox Code Playgroud)

尝试获取人员 ID 的值。这是(部分)存储在 JSON_Data 列中的 JSON:

"Person's_ID": "Test"
Run Code Online (Sandbox Code Playgroud)

我试过使用两个单引号,但这仍然出现错误:

JSON 路径格式不正确。在位置 8 处发现了意外字符 '''。”

使用反斜杠转义单引号也不起作用。

Aar*_*and 5

这可能是一个很好的教训,不要制作垃圾 JSON(并在将其插入数据库之前对其进行验证),因为根据标准,单引号不是实体名称中可接受的字符。:-)

您可以尝试这种类型的替换,但性能将非常糟糕,它将替换 的所有实例Person's_ID,而不仅仅是当它作为对象出现时:

SELECT JSON_VALUE(REPLACE(JSON_Data,'Person''s_ID','Person_s_ID'), '$.Person_s_ID')
  FROM dbo.Table;
Run Code Online (Sandbox Code Playgroud)

工作示例:

DECLARE @d varchar(255) = '{"Person''s_ID": "Test"}';
SELECT JSON_VALUE(REPLACE(@d,'Person''s','Person_s'), '$.Person_s_ID');
Run Code Online (Sandbox Code Playgroud)

结果:

Test
Run Code Online (Sandbox Code Playgroud)