添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
with open('EmployeeDataList.json') as json_data: employee_data = json.load(json_data) '''employee_data = json.dump(json.load(json_data))''' '''employee_data = commentjson.load(json_data)''' print(employee_data)`

仍然无法从文件中删除注释并将 正确格式的JSON文件。

不明白哪里出了问题?如果有任何这方面的指导,我们将非常感激。

5 个评论
你为什么要使用 commentjson
// 注释在JSON中是不允许的。所以你所得到的不是有效的JSON。你必须在解析前删除注释。
@Klaus D...这是一种生成JSON文件的方式。有没有办法从文件中删除注释行,使其成为正确的格式?在互联网上搜索时,我也遇到了JSON5,但无法了解如何使用它?
@user4569636: 你的文件不容易被转化为有效的JSON。它不仅包含注释,还包含对变量的引用。 "Skill": CT70
你所拥有的可能是JSON5,它包含注释和变量,正如@Blender提到的。这似乎只能由Javascript来解析,而不是Python。 github.com/json5/json5
python
json
Eupheus
Eupheus
发布于 2017-04-09
6 个回答
Blender
Blender
发布于 2017-04-09
已采纳
0 人赞同

你没有正确使用 commentjson 。它的接口与 json 模块相同。

import commentjson
with open('EmployeeDataList.json', 'r') as handle:
    employee_data = commentjson.load(handle)
print(employee_data)

虽然在这种情况下,你的评论足够简单,你可能不需要安装一个额外的模块来删除它们。

import json
with open('EmployeeDataList.json', 'r') as handle:
    fixed_json = ''.join(line for line in handle if not line.startswith('//'))
    employee_data = json.loads(fixed_json)
print(employee_data)

请注意,这两个代码片段的不同之处在于使用了json.loads而不是json.load,因为你正在解析一个字符串而不是一个文件对象。

@用户4569636 怎么说?他提出的第二个解决方案应该可以解决你发布的例子。
@Posh_Pumpkin:"JSON "包含变量( "Skill": CT70 ),而不仅仅是注释。
@Posh_Pumpkin 见我的回答
@Blender...谢谢。第二个解决方案确实解决了这个问题,但是多了一个 "u'EmployeeCode": u'200005ABH9",而且JSON文件的顺序也变了。
@user4569636: u 前缀只是表示一个unicode字符串,这不是一个问题。至于顺序,JavaScript中的对象和Python中的字典都是无序的。如果顺序重要,你可以让 json.loads 使用Python的 OrderedDict stackoverflow.com/questions/6921699/...
hailinzeng
hailinzeng
发布于 2017-04-09
0 人赞同

Try JSON-minify :

JSON-minify通过去除所有的空白和JS风格的注释(单行//和多行/* ... */),将类似JSON的内容块简化为有效的JSON。

Tomas Ruiz
Tomas Ruiz
发布于 2017-04-09
0 人赞同

我通常把JSON当作一个普通文件来读,删除注释,然后把它解析成JSON字符串。这可以通过下面的片段在一行中完成。

with open(path,'r') as f: jsonDict = json.loads('\n'.join(row for row in f if not row.lstrip().startswith("//")))

我认为它非常方便,因为它不需要CommentJSON或任何其他非标准库。

有趣的答案,但在含有 // 的行上会失败,而不是在开头,例如: {"foo": "http://bar.com"} 。最好写成 if not row.lstrip().startswith("//") 。另外,如果你去掉 .readlines() 和方括号,那么这些行将被懒散地迭代(但在传递到 loads 之前仍被连接起来),这将会稍微更有效率。
spicypumpkin
spicypumpkin
发布于 2017-04-09
0 人赞同

这不是一个有效的 json 格式,所以只要像打开一个文本文件一样打开它,然后删除从 // \n 的任何内容。

with open("EmployeeDataList.json", "r") as rf:
    with open("output.json", "w") as wf:
        for line in rf.readlines():
            if line[0:2] == "//"
                continue
            wf.write(line)
    
你可以在同一行有两个 open
@cricket_007 huh? Where?
我只是说第二个 open() as wf 可以移到第一行。
@cricket_007 哦,等等,对不起,我完全读错了你的评论,mb
OneCricketeer
OneCricketeer
发布于 2017-04-09
0 人赞同

你的文件是可解析的 using HOCON .

pip install pyhocon

>>> from pyhocon import ConfigFactory
>>> conf = ConfigFactory.parse_file('data.txt')
ConfigTree([('EmployeeDataList',
             [ConfigTree([('EmployeeCode', '200005ABH9'),
                          ('Skill', 'CT70'),
                          ('Sales', 0.0),
                          ('LostSales', 1010.4)])])])
    
kpie
kpie
发布于 2017-04-09
0 人赞同

如果每次都是相同的行数,你可以直接做。

fh = open('EmployeeDataList.NOTjson',"r")