【问题标题】:Convert to 'Strict' JSON转换为“严格”JSON
【发布时间】:2019-03-05 15:36:22
【问题描述】:

我有一个 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']]}

Python 代码:

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')

该过程继续完成,没有对任何文件进行编辑。此外,该脚本运行时间不到一秒钟。没有错误信息。 任何帮助将不胜感激。

【问题讨论】:

  • path 到底是什么?
  • 我假设路径是文件路径
  • meta_Video_Games.json.gz - 您需要提供此文件的正确路径。这个文件存储在哪里?
  • 在 D 盘。所以路径是“D:\\meta_Video_Games.json.gz”
  • 尝试将其传递给“解析”函数。

标签: python json


【解决方案1】:

有很多问题,首先是在你从别人那里得到的数据上使用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。

【讨论】:

  • 感谢您的帮助。我没有意识到 eval 是一个安全问题,感谢您指出这一点。我试过这段代码并得到这个错误。 raise ValueError('malformed node or string: ' + repr(node)) ValueError: malformed node or string: 我认为你帮助我走上了正确的道路,但我一直坚持下去。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2016-01-03
  • 2021-07-09
  • 1970-01-01
  • 2014-09-18
相关资源
最近更新 更多