大创项目踩坑记录
- python在导入json包后,用
json.loads(string)
读取json对象转换成python中的字典dict的时候,该对象应该是一个完整的字符串,字符串内的字符要合法,例如:若使用vscode中_Beautify Json_ 插件,为只有一行的json增加横多换行符"\n"
来增加人类的易读性,在用data_dictionary = json.loads(obj)
的时候会报错,因为loads函数不识别不合法(json)字符串。我遇到的报错如下
看traceback说缺东西,缺一个value,第二行调用
json.loads()
出错了JSONDecodeError: Expecting value: line 1 column 1 (char 0)
---------------------------------------------------------------------------
JSONDecodeError Traceback (most recent call last)
/tmp/ipykernel_4336/3512504032.py in
1 source_str = source.read()
----> 2 source_data = json.loads(source_str)
3 source_data
接着看调用栈
首先是loads函数的签名,344~345行都是说那个函数签名里的东西要为非空。看345的最后是右括号冒号结尾,推测是一个if语句,好奇的可以根据下面文件地址找找
<Path>/json/__init__.py
里面是啥,我是linux系统,win和mac估计也差不多,要学会找路径。
继续,问题出在346行,说明前面非空的if语句满足了,是最后_default_decoder.decode(s)
这里出问题了,到这里说明,我写的代码没有问题,是解码decode的时候出问题。大概率是json文件本身的文本问题。/usr/lib/python3.9/json/init.py in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
344 parse_int is None and parse_float is None and
345 parse_constant is None and object_pairs_hook is None and not kw):
–> 346 return _default_decoder.decode(s)
347 if cls is None:
348 cls = JSONDecoder
继续往下看
避免篇幅冗余(虽然已经很罗嗦了),来到
decoder.py
这里发现是337行出问题/usr/lib/python3.9/json/decoder.py in decode(self, s, _w)
335
336 “”"
–> 337 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
338 end = _w(s, end).end()
339 if end != len(s):
非常明了了,是json文件格式的问题。但是具体355这句话的深层含义我目前不是特别理解,可能要查看官方文档才能理解
/usr/lib/python3.9/json/decoder.py in raw_decode(self, s, idx)
353 obj, end = self.scan_once(s, idx)
354 except StopIteration as err:
–> 355 raise JSONDecodeError(“Expecting value”, s, err.value) from None
356 return obj, end报错内容:
JSONDecodeError: Expecting value: line 1 column 1 (char 0)