【问题标题】:Trouble parsing JSON object in Python在 Python 中解析 JSON 对象时遇到问题
【发布时间】:2015-09-04 12:40:23
【问题描述】:

我正在尝试使用 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()) 也不起作用,并给我一个几乎相同的错误跟踪。

编辑 - 已解决:

我刚刚将 FROM map.txt 复制并粘贴到一个新的 TextEdit 文件 map2.txt 中,并改用了新文件,它现在可以工作了。我直接从旧文件复制并没有进行任何更改 - 唯一的区别是它是一个不同的文件。我不知道为什么会这样——有什么想法吗?我想了解可能发生的情况,以便将来避免该问题。

【问题讨论】:

  • @John 它已被添加!
  • 如果我将您的 JSON 内容复制到一个文件中并在 Python 2.7 中使用 json.load(file('blah.txt')) 加载它,它工作正常。如果我将它复制到 ideone.com 并使用 Python 3 和 json.loads(""" blah blah """) 它可以工作。诡异的。我不得不猜测它要么引用了错误的文件(名称中的拼写错误),要么文件被保存在一个奇怪的编辑器/编码中,这使得它被不同地解释?
  • @TessellatingHeckler 我将它保存在 TextEdit 中并确保它是纯文本。文件名也绝对正确。 :(
  • 通过跟踪,肯定有比@shinytinsmile 更多的代码,它可能是由其他代码行引起的,不一定在你给我们的这个块中。因为您提供给我们的代码有效
  • 重点。我注意到它在错误中显示MAP_list = json.load(f2) ,在您的代码示例中它被称为f1 - 您打开正确的文件名但随后传递 json.load 一个不同的文件变量?

标签: python json parsing


【解决方案1】:

也许尝试将所有文​​件读取为字符串,然后使用 json.loads

         def yourfunc():
             file = open('map.txt')
             json_string = file.read()
             map = json.loads(json_string)

【讨论】:

  • 这不是真正的答案。一些示例代码会更有帮助
【解决方案2】:

以下解决方案对您有用吗?

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

Python Docs

【讨论】:

  • 这可能是一个不寻常的空白 ('\r\n') 或 ('\t')。通常,在 emacs 中打开文件会突出显示这些不寻常的空白,这些空白可能会被某些 Windows 应用程序注入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多