首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何打开和编辑不正确的json文件?

如何打开和编辑不正确的json文件?
EN

Stack Overflow用户
提问于 2021-01-10 00:53:09
回答 2查看 582关注 0票数 0

也许这个问题有点傻,但实际上我不知道如何解决它。我有一个json文件格式错误。它在第一个{之前有一个b‘,而且它使用单引号而不是双引号,而双引号不是json的公认格式。

我知道我必须用双引号代替单引号。我会用这样的方法:

代码语言:javascript
运行
复制
json = file.decode('utf8').replace("'", '"')

但问题是,如果我无法打开文件中的引号,如何替换它呢?

代码语言:javascript
运行
复制
import json

f = open("data/qa_Automotive.json",'r')
file = json.load(f)

打开文件会给我一个错误,因为它有单引号而不是双引号:

代码语言:javascript
运行
复制
JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

如果我不能打开json文件中的引号,因为它的格式是错误的,我应该如何修改它呢?(这是json文件btw:https://jmcauley.ucsd.edu/data/amazon/qa/qa_Appliances.json.gz)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-10 02:33:08

该文件不是JSON (文件名不正确),而是由有效的Python文本组成。没有理由尝试将其转换为JSON。不要这样做;相反,只需要告诉Python按原样解析它。

代码语言:javascript
运行
复制
#!/usr/bin/env python3
import ast, json

results = [ ast.literal_eval(line) for line in open('qa_Appliances.json') ]
print(json.dumps(results))

...properly为您提供了一个名为results的列表,其中包含您的所有行,并且(为了演示目的)将其作为JSON转储到stdout。

票数 2
EN

Stack Overflow用户

发布于 2021-01-10 01:16:24

该文件存在多个问题:

  • it是ndjson (新行分隔,每行是单个对象)
  • 有一个引号

的混合

第一个问题很容易解决,你可以单独加载每一行,第二个问题是骗子。

我试图(就像您所做的那样)简单地用"替换"。但这还不够,因为文本中有' (比如“you‘s”),这里有一个单引号。如果您替换了所有的',那么它将被转换为一个"并中断您的字符串。

您将得到类似于"message": "you"re"的无效信息。

因为这个文件有很多问题,所以我建议使用一些脏的东西: python函数。

eval简单地播放一个字符串,就好像它是一个命令一样。

代码语言:javascript
运行
复制
>>> eval("4 + 2")
6

因为json格式和Python本机dict类型非常接近(减去一些差别,比如Python True/False和json使用true/false )。Python使用None,json使用null,可能还有其他我忘记的),具有卷括号和平方括号的结构是相同的。但是在这里,由于Python既支持单引号,又支持双引号,所以"eval“可以帮助您。

使用文件中的一行:

代码语言:javascript
运行
复制
>>> import json
>>> 
>>> data = "{'questionType': 'yes/no', 'asin': 'B0002Z1GG0', 'answerTime': 'Dec 10, 2013', 'unixTime': 1386662400, 'question': 'would this work on my hotpoint model ctx14ayxkrwh serial hr749157 refrigerator do the drawers slide into slots ?', 'answerType': '?', 'answer': 'the drawers do fit into the slots.'}"
>>> parsed = eval(data)
>>> print(parsed)
{'questionType': 'yes/no', 'asin': 'B0002Z1GG0', 'answerTime': 'Dec 10, 2013', 'unixTime': 1386662400, 'question': 'would this work on my hotpoint model ctx14ayxkrwh serial hr749157 refrigerator do the drawers slide into slots ?', 'answerType': '?', 'answer': 'the drawers do fit into the slots.'}
>>> type(parsed)
<class 'dict'>
>>> print(json.dumps(parsed, indent=2))
{
  "questionType": "yes/no",
  "asin": "B0002Z1GG0",
  "answerTime": "Dec 10, 2013",
  "unixTime": 1386662400,
  "question": "would this work on my hotpoint model ctx14ayxkrwh serial hr749157 refrigerator do the drawers slide into slots ?",
  "answerType": "?",
  "answer": "the drawers do fit into the slots."
}

我可以在整个文件中做到这一点:

代码语言:javascript
运行
复制
>>> data = open("<path to file>").readlines()
>>> parsed = [ eval(line) for line in data ]
>>> 
>>> len(parsed)
9011
>>> parsed[0]
{'questionType': 'yes/no', 'asin': 'B00004U9JP', 'answerTime': 'Jun 27, 2014', 'unixTime': 1403852400, 'question': 'I have a 9 year old Badger 1 that needs replacing, will this Badger 1 install just like the original one?', 'answerType': '?', 'answer': 'I replaced my old one with this without a hitch.'}
>>> parsed[0]['questionType']
'yes/no'

--您不应该对无卫生状态的数据使用eval,因为它可以用来破坏您的系统,但是如果您在受控的环境中使用它,您就会使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65649170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档