python - 转换为“严格”JSON
问题描述
我有一个 JSON 文件,创建者说它不是“严格”的 JSON,并提供了 python 代码将其转换为严格的 JSON。我是 python 新手,不断收到错误消息。
JSON 示例:
{'asin': '0078764343', 'description': 'Brand new sealed!', 'price': 37.98, 'imUrl': 'http://ecx.images-amazon.com/images/I/513h6dPbwLL._SY300_.jpg', 'related': {'also_bought': ['B000TI836G', 'B003Q53VZC', 'B00EFFW0HC', 'B003VWGBC0', 'B003O6G5TW', 'B0037LTTRO', 'B002I098JE', 'B008OQTS0U', 'B005EVEODY', 'B008B3AVNE', 'B000PE0HBS', 'B00354NAYG', 'B0050SYPV2', 'B00503E8S2', 'B0050SY77E', 'B0022TNO7S', 'B0056WJA30', 'B0023CBY4E', 'B002SRSQ72', 'B005EZ5GQY', 'B004XACA60', 'B00273Z9WM', 'B004HX1QFY', 'B002I0K50U'], 'bought_together': ['B002I098JE'], 'buy_after_viewing': ['B0050SY5BM', 'B000TI836G', 'B0037LTTRO', 'B002I098JE']}, 'salesRank': {'Video Games': 28655}, 'categories': [['Video Games', 'Xbox 360', 'Games']]}
蟒蛇代码:
import json
import gzip
def parse(file_path=r"c:\Users\kiero\PycharmProjects\untitled\source\reviews_Video_Games.json.gz"):
g = gzip.open(file_path, 'r')
for l in g:
yield json.dumps(eval(l))
f = open("C:\\Users\\kiero\\PycharmProjects\\untitled\\source\\reviews_Video_Games.json.gz",'w')
for l in parse("C:\\Users\\kiero\\PycharmProjects\\untitled\\source\\reviews_Video_Games.json.gz"):
f.write(l + '\n')
该过程继续完成,无需编辑任何文件。此外,该脚本运行时间不到一秒钟。没有错误信息。任何帮助,将不胜感激。
解决方案
有很多问题,首先是使用eval
从其他人那里获得的数据是一个巨大的安全漏洞。
第二个是你的代码缩进错误——从那f = open(
以后调用的部分parse
不应该缩进,它的当前方式是它的一部分parse
并且该函数永远不会被调用(所以什么都没有发生)。
, "w"
第三,您打开与在下一行读取完全相同的文件(使用 )进行写入;但是打开一个文件进行写入会清空它。所以没有数据,那里的东西被破坏了。
第四,您打开用于写入的文件具有“.gz”文件名,但以文本形式写入,因此结果永远不会是 gzip 文件。
真实代码可能如下所示:
import ast, gzip, json
INFILE = 'c://path/to/infile.gz' # Gzip file
OUTFILE = 'c://path/to/other/file/out.json' # Text file with generated JSON
in_f = gzip.open(INFILE)
out_f = open(OUTFILE, 'w')
for line in in_f:
data = ast.literal_eval(line) # Assuming the line is a valid Python literal
out_f.write(json.dumps(data) + '\n')
in_f.close()
out_f.close()
第五,最终结果每行仍然有一个数据对象,因此整个文件仍然不是有效的 JSON——一个 JSON 字符串代表一个对象。每个单独的行都是有效的 JSON。
推荐阅读
- android - Android:从服务器上的 JSON 文件中获取没有键的数组中的值
- tensorflow - 如何使用 amd radeon r4/r5 显卡在 ubuntu 上安装 tensorflow-gpu
- javascript - 如何编写正则表达式以在 javascript 中查找 :smile:?
- mysql - 错误:'用户'root'@'localhost'的访问被拒绝(使用密码:YES)'和NO两者在Windows 10上。如何进行root登录?
- elf - 读取 ELF 文件中的 DIE
- mysql - MySQL - 如何在关系查询中分页模糊查询的结果
- java - 在我的应用中使用 Street View VR
- python-3.x - 在 python 中更改客户端/服务器环境中的工作目录
- javascript - 对象不支持属性或方法“getAll”
- swift - AVQueuePlayer 当前项目已更改