Python中解析JSON对象出现问题

3

我正在尝试使用json.load()方法在Python中解析包含JSON对象的一些文本文件。它适用于其中一组文件,但对于这个文件不起作用:

{
"mapinfolist":{
  "mapinfo":[
  {"sku":"00028-0059","price":"38.35","percent":"50","basepercent":"50","exact":0,"match":0,"roundup":0}
  ,{"sku":"77826-7230","price":"4.18","percent":"60","basepercent":"60","exact":1,"match":0,"roundup":0}
  ,{"sku":"77827-1310","price":"2.36","percent":"60","basepercent":"60","exact":1,"match":0,"roundup":0}
  ,{"sku":"77827-2020","price":"2.36","percent":"60","basepercent":"60","exact":1,"match":0,"roundup":0}
  ,{"sku":"77827-3360","price":"2.36","percent":"60","basepercent":"60","exact":1,"match":0,"roundup":0}
  ,{"sku":"77827-4060","price":"2.36","percent":"60","basepercent":"60","exact":1,"match":0,"roundup":0}
  ,{"sku":"77827-4510","price":"2.36","percent":"60","basepercent":"60","exact":1,"match":0,"roundup":0}
  ,{"sku":"77827-7230","price":"2.36","percent":"60","basepercent":"60","exact":1,"match":0,"roundup":0}
  ],
  "count":2
}
}

它在一个名为"map.txt"的文件中 - 我使用open('map.txt')打开它,然后调用json.load()。当我运行我的测试程序(test.py)时,会生成以下错误跟踪:

Traceback (most recent call last):
  File "test.py", line 28, in <module>
    main()
  File "test.py", line 23, in main
    map_list = json.load(f1) 
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/json/__init__.py", line 268, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/json/__init__.py", line 318, in loads
return _default_decoder.decode(s)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/json/decoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/json/decoder.py", line 361, in raw_decode
raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 1 (char 0)

这个JSON对象是有效的 - 当我将它放入https://www.jsoneditoronline.org/中时,它被正确解析和显示,所以我很难确定在Python中尝试它时可能会停止工作的原因。任何建议都将不胜感激。谢谢!

编辑:这是我的代码。

import json
def main():

with open('map.txt') as f1:
    map_list = json.load(f1)

尝试使用map_list = json.loads(f1.read())也不起作用,并且给出了几乎相同的错误跟踪。

编辑-已解决:

我只是从map.txt复制并粘贴到一个新的TextEdit文件map2.txt中,然后使用新文件,现在它可以工作了。我直接从旧文件中复制,没有做任何更改-唯一的区别是它是一个不同的文件。我无法理解为什么会这样-有任何想法吗? 我想了解可能发生了什么,以便将来避免此问题。


@John,已添加! - shinytinsmile
如果我将您的JSON内容复制到文件中,并在Python 2.7中使用json.load(file('blah.txt'))加载它,那么它可以正常工作。如果我将其复制到http://ideone.com并使用Python 3和json.loads(""" blah blah """),它也可以正常工作。奇怪。我猜测要么是引用了错误的文件(名称中有错别字),要么是该文件以奇怪的编辑器/编码保存,导致其被解释为不同的内容? - TessellatingHeckler
@TessellatingHeckler 我把它保存在TextEdit中,并确保它是纯文本。文件名也绝对正确。:( - shinytinsmile
通过跟踪,肯定有比@shinytinsmile更多的代码,可能是由其他代码行引起的,不一定是在您提供的这个代码块中。由于您提供的代码可以正常工作。 - heinst
1
这是一个要点。我注意到错误信息中写着 MAP_list = json.load(f2),而在你的代码示例中它被称为 f1 - 有没有可能你打开了正确的文件名,但是却传递了不同的文件变量给 json.load 函数? - TessellatingHeckler
显示剩余8条评论
2个回答

0

以下解决方案对您是否有效?

import json
f = open("map.txt")
map = json.loads(f.read())

Python文档


可能是一个不寻常的空格符('\r\n')或('\t')。在emacs中打开文件时,通常会突出显示这些不寻常的空格符,这些空格符可能是由某些Windows应用程序注入的。 - Matt

-2
也许尝试将整个文件读取为字符串,然后使用json.loads函数。
         def yourfunc():
             file = open('map.txt')
             json_string = file.read()
             map = json.loads(json_string)

这并不是一个真正的答案。一些示例代码会更有帮助。 - heinst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接