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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 12:42:46