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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:39:19