Athena中json_extract_scalar无法从单引号JSON字符串提取值的问题求助
解决Athena中解析单引号JSON字符串的问题
我来帮你搞定这个问题!你遇到的核心问题是原始的JSON字符串不符合标准JSON规范,再加上之前的替换方式用错了字符,导致Athena的JSON解析函数无法识别。
问题拆解
- 你的原始JSON用了单引号包裹键和值:
{'is_referred': False, 'landing_page': '/account/register'},但标准JSON要求必须用双引号,Athena的json_extract_scalar只认标准格式。 - 你之前替换成
"是HTML转义字符,不是实际的双引号,所以解析函数还是无法识别。 - 另外,原始JSON里的
False是首字母大写,而标准JSON的布尔值必须是小写的false,这也会导致解析失败。
直接可用的解决方案
用replace函数把单引号替换为实际的双引号,同时修正布尔值的大小写:
SELECT json_string, -- 先替换所有单引号为双引号,再把大写的布尔值转成小写 replace(replace(json_string, '''', '"'), 'False', 'false') as standard_json, json_extract_scalar(standard_json, '$.landing_page') as landing_page FROM my_table;
执行这个查询后,你应该就能正确提取landing_page的值了。
更严谨的正则替换(针对复杂场景)
如果你的JSON字符串里可能存在单引号包裹的字符串值(比如{'name': 'O''Neil'}),全局替换单引号会破坏这些值,这时候可以用正则精准替换键名的单引号:
SELECT json_string, regexp_replace( regexp_replace(json_string, '''(\w+)''', '"\1"'), -- 只替换键名的单引号为双引号 ': (False|True)', ': \L\1' -- 把True/False转成小写的true/false ) as standard_json, json_extract_scalar(standard_json, '$.landing_page') as landing_page FROM my_table;
这个正则只会替换键名(比如'is_referred')的单引号,不会影响字符串值里的单引号,同时自动修正布尔值的大小写。
为什么之前的方法无效?
你之前用replace(json_string, '''', '"')生成的字符串是:
{"is_referred": False, "landing_page": "/account/register"}
这不是有效的JSON——JSON解析器只识别实际的双引号字符("),而不是HTML实体",所以json_extract_scalar会返回null。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

