如何通过S3FileSystem将JSON字典以正确格式保存至S3?
问题
我正在开展一个项目,需将CSV转换为JSON字典,并通过S3FileSystem将该JSON数据文件保存至S3存储桶。本地保存时格式正常,但S3中的JSON存在转义问题,表现为外层带引号且内部引号被转义。
本地正常JSON格式示例:
{"Index": "HSI", "Date": "12/31/1986", "Open": 2568.300049, "High": 2568.300049, "Low": 2568.300049, "Close": 2568.300049, "Adj Close": 2568.300049, "Volume": 0.0, "CloseUSD": 333.8790064}
S3中异常格式示例:
"{\"Index\": \"GSPTSE\", \"Date\": \"1990-01-24\", \"Open\": 3760.399902, \"High\": 3763.399902, \"Low\": 3747.100098, \"Close\": 3761.5, \"Adj Close\": 3751.947998, \"Volume\": 44720000.0, \"CloseUSD\": 3122.045}"
使用的代码如下:
Kafka生产者代码
while True: dict_stock = df.sample(1).to_dict(orient="records")[0] producer_2.send('demo_stock_market',value=dict_stock)
Kafka消费者写入S3的代码
for count, i in enumerate(consumer): with s3.open("s3://de-on-kafka-stock-raw-useast2-dev/kafka_stock_market_{}.json".format(count),'w',encoding='utf-8') as file: print(i.value) json.dump(i.value,file,indent=4)
请问如何将JSON数据以正确格式保存到S3?
解决方案
问题核心
Kafka消费者接收到的i.value已经是JSON字符串,而非原始字典对象。此时用json.dump()处理,会把这个字符串当成普通文本进行JSON序列化,导致外层自动添加引号、内部引号被转义。
修复方案(二选一即可)
方案1:解析字符串为字典后序列化
先将JSON字符串解析为Python字典,再用json.dump()写入文件:
import json for count, i in enumerate(consumer): # 把JSON字符串转成Python字典 stock_dict = json.loads(i.value) with s3.open("s3://de-on-kafka-stock-raw-useast2-dev/kafka_stock_market_{}.json".format(count),'w',encoding='utf-8') as file: json.dump(stock_dict, file, indent=4)
方案2:直接写入原始JSON字符串
如果不需要重新格式化JSON,直接把接收到的字符串写入文件,跳过json.dump()步骤,效率更高:
for count, i in enumerate(consumer): with s3.open("s3://de-on-kafka-stock-raw-useast2-dev/kafka_stock_market_{}.json".format(count),'w',encoding='utf-8') as file: file.write(i.value) # 可选:添加换行符让文件格式更整洁 file.write('\n')
内容的提问来源于stack exchange,提问作者Python Learner
相关产品推荐
相关产品推荐

