AWS Glue解析含表情符号的WhatsApp JSON文件失败求助
解决WhatsApp JSON表情符号转义导致AWS Glue解析失败的问题
问题根源
你遇到的是json.dumps生成了\U0001f90c这类Unicode转义序列文本(不是实际的Unicode字符),AWS Glue的JSON解析器无法正确识别这类转义,导致解析失败。之前的方案无效是因为:
- 第一种替换操作是在替换实际的Unicode字符
🤌,但字符串里存的是转义后的文本\U0001f90c(即由\、U、0001f90c这些字符组成的序列),自然匹配不到。 - 第二种
ensure_ascii=False参数是让json.dumps直接输出UTF-8字符而非转义,但如果后续又对输出的字符串做了二次转义(比如写入文件时用了默认ASCII编码),转义序列还是会出现。
可行解决方案
1. 生成JSON时直接输出原生表情符号(推荐)
避免生成转义序列的根本方法是在写入JSON文件时指定UTF-8编码,直接输出表情符号:
import json # 直接写入文件,用utf-8编码确保表情符号不被转义 with open("whatsapp_contacts.json", "w", encoding="utf-8") as f: json.dump(contact_response_obj, f, ensure_ascii=False)
这样生成的JSON文件中会直接显示🤌这类表情符号,而非转义序列,AWS Glue可以正常解析。
2. 批量修复已生成的带转义序列的JSON字符串
如果已经有了包含\U0001f90c转义序列的JSON字符串,用正则表达式批量替换所有此类转义为实际字符:
import re def resolve_unicode_escapes(raw_str): # 匹配所有\U开头的8位十六进制转义序列,转换为对应Unicode字符 return re.sub(r'\\U([0-9a-fA-F]{8})', lambda match: chr(int(match.group(1), 16)), raw_str) # 示例:修复带转义的字符串 string_data = 'LE JOOCHAR \\U0001f90c💪' fixed_data = resolve_unicode_escapes(string_data) # fixed_data 结果为 'LE JOOCHAR 🤌💪'
3. 在AWS Glue端直接处理转义序列
如果无法修改JSON生成流程,在Glue的Spark作业中用自定义UDF处理用户名列:
from pyspark.sql.functions import udf from pyspark.sql.types import StringType import re @udf(StringType()) def fix_username_unicode(username): if not username: return username return re.sub(r'\\U([0-9a-fA-F]{8})', lambda m: chr(int(m.group(1), 16)), username) # 读取JSON数据后应用UDF df = spark.read.json("s3://your-bucket/path/contacts.json") df = df.withColumn("fixed_username", fix_username_unicode(df["username"]))
内容的提问来源于stack exchange,提问作者Teddy Kossoko
相关产品推荐
相关产品推荐

