如何让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
相关产品推荐
相关产品推荐

