Pandas列转JSON后被字符串包裹 如何导出原生字典对象数组?
问题根因
出现JSON对象被字符串包裹、序列化后带转义符的核心原因是:
你在生成df['D']列时调用to_json(),得到的是JSON格式的字符串,而非Python原生字典对象。后续把这些字符串收集到列表中再执行json.dumps()时,序列化器会将字符串本身作为输出值,不会自动将其解析为JSON对象,最终就会得到带外层引号、转义斜杠的字符串数组。
解决方法
推荐优先从数据处理流程优化,避免中间步骤提前做序列化;如果不想改动已有前序逻辑,也可以在最终导出前做反向解析。
方案1:源头优化,中间步骤保留原生数据类型(推荐)
不要在生成D列时就转成JSON字符串,直接存储Python原生字典,将JSON序列化操作放到最终导出的最后一步执行,既可以避免字符串包裹问题,也能提升代码运行效率。
完整实现代码:
import pandas as pd import json # 初始化示例数据 df = pd.DataFrame({ 'A': [1, 1, 4], 'B': [3, 2, 5], 'C': [6, 4, 0] }) # 生成D列时直接转原生字典,不要提前转JSON字符串 # 如果需要B、C值为字符串类型,可自行做类型转换:{'B': str(x['B']), 'C': str(x['C'])} df['D'] = df.apply(lambda x: x[['B', 'C']].to_dict(), axis=1) # 分组聚合,替代原来的iterrows循环+set去重逻辑(字典不可哈希,无法直接存入set) df2 = df.groupby('A', as_index=False)['D'].apply(lambda x: list(x.drop_duplicates())) df2.columns = ['A', 'E'] # 最终导出时再做JSON序列化,即可得到目标格式 data = df2.loc[df2['A'] == 1, 'E'].iloc[0] payload = json.dumps(data)
执行后payload的输出为:
[{"B": 3, "C": 6}, {"B": 2, "C": 4}]
完全符合你期望的原生对象数组格式。
方案2:对已生成的字符串列表做反向解析
如果你不想修改前序生成D列、E列的逻辑,可以在序列化之前,把列表里的每个JSON字符串通过json.loads()解析为原生字典,再做整体序列化:
import json # 假设str_list是你当前E列存储的、由JSON字符串组成的列表 str_list = ['{"B":"3","C":"6"}', '{"B":"2","C":"4"}'] # 逐个解析为字典对象 obj_list = [json.loads(item_str) for item_str in str_list] # 再做整体序列化 payload = json.dumps(obj_list)
注意事项
- 原代码中用
set()对D列值去重的逻辑仅适用于可哈希类型(比如字符串、数字),如果存储的是字典类型会直接报错,推荐用groupby+drop_duplicates()的方式实现分组去重,性能比逐行迭代iterrows()高一个量级。 - 数据处理流程中,尽量在中间环节保留原生数据类型(字典、列表、数值等),JSON/CSV等格式的序列化操作放到最终导出的最后一步执行,可以避免绝大多数转义、格式嵌套问题。
内容的提问来源于stack exchange,提问作者ApacheOne
相关产品推荐
相关产品推荐

