You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Athena中json_extract_scalar无法从单引号JSON字符串提取值的问题求助

解决Athena中解析单引号JSON字符串的问题

我来帮你搞定这个问题!你遇到的核心问题是原始的JSON字符串不符合标准JSON规范,再加上之前的替换方式用错了字符,导致Athena的JSON解析函数无法识别。

问题拆解

  1. 你的原始JSON用了单引号包裹键和值:{'is_referred': False, 'landing_page': '/account/register'},但标准JSON要求必须用双引号,Athena的json_extract_scalar只认标准格式。
  2. 你之前替换成"是HTML转义字符,不是实际的双引号,所以解析函数还是无法识别。
  3. 另外,原始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:17:31