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

如何让Pandas to_json输出双引号格式以适配Elasticsearch?

解决Pandas to_json输出单引号JSON不兼容Elasticsearch的问题

我来帮你捋清楚这个问题——其实你遇到的不是to_json的问题,而是Python对象打印时的显示差异!

先抓关键:df.to_json(orient="records")本身生成的就是标准的双引号JSON字符串,你可以直接打印tmp看看,绝对是符合JSON规范的格式。而你调用json.loads(tmp)之后得到的是Python的字典列表,Python在打印这类对象时默认用单引号,但这只是Python内部的表示方式,根本不是JSON格式。

那怎么解决呢?分两种情况处理:

  • 直接传给Elasticsearch的场景:完全不需要调用json.loads,直接用to_json生成的tmp字符串就可以了,它本身就是Elasticsearch能识别的合法JSON。
  • 必须先解析成Python对象再处理的场景:处理完Python对象后,记得用json.dumps()把它重新序列化为标准JSON字符串,而不是直接打印Python对象。

修改后的示例代码如下:

try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO
myst=""" 20-01-17 pizza 90 21-01-17 pizza 120 22-01-17 pizza 239 23-01-17 pizza 200 20-01-17 fried-rice 100 21-01-17 fried-rice 120 22-01-17 fried-rice 110 23-01-17 fried-rice 190 20-01-17 ice-cream 8 21-01-17 ice-cream 23 22-01-17 ice-cream 21 23-01-17 ice-cream 100 """
u_cols=['date', 'product', 'sales']
myf = StringIO(myst)
import pandas as pd
df = pd.read_csv(StringIO(myst), sep='\s+', names = u_cols)

# 方案1:直接使用to_json生成的字符串,无需解析
tmp = df.to_json(orient="records")
print(tmp)  # 输出双引号的标准JSON,可直接传给Elasticsearch

# 方案2:如果需要先解析处理,再重新序列化
import json
data = json.loads(tmp)
# 这里可以对data做自定义处理
valid_json = json.dumps(data)
print(valid_json)  # 同样输出双引号的标准JSON

这样你得到的就是Elasticsearch支持的双引号JSON格式了。

内容的提问来源于stack exchange,提问作者shantanuo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:21:31