为什么Python3 json.loads(";foo.com";)还不能工作,而json.loads(";123.6";)却不能工作?
当我尝试加载“foo.com”时,我得到了一个异常,正如预期的那样;但是,如果我正在加载一个包含浮点数的字符串,它就会工作。只是想弄明白为什么会这样为什么Python3 json.loads(";foo.com";)还不能工作,而json.loads(";123.6";)却不能工作?,json,python-3.x,Json,Python 3.x,当我尝试加载“foo.com”时,我得到了一个异常,正如预期的那样;但是,如果我正在加载一个包含浮点数的字符串,它就会工作。只是想弄明白为什么会这样 $ python3 Python 3.6.5 (default, Jun 17 2018, 12:13:06) [GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)] on darwin Type "help", "copyright", "credits" or "license" f
$ python3
Python 3.6.5 (default, Jun 17 2018, 12:13:06)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>> j = json.loads("foo.com")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
>>> j = json.loads("123.6")
>>>
$python3
Python 3.6.5(默认值,2018年6月17日,12:13:06)
[GCC 4.2.1达尔文兼容苹果LLVM 9.1.0(clang-902.0.39.2)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入json
>>>j=json.loads(“foo.com”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/cillar/python/3.6.5_1/Frameworks/python.framework/Versions/3.6/lib/python3.6/json/__init___.py”,第354行,在loads中
返回\u默认\u解码器。解码
文件“/usr/local/ceral/python/3.6.5_1/Frameworks/python.framework/Versions/3.6/lib/python3.6/json/decoder.py”,第339行,在decode中
obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
文件“/usr/local/ceral/python/3.6.5_1/Frameworks/python.framework/Versions/3.6/lib/python3.6/json/decoder.py”,第357行,原始解码
从None引发JSONDecodeError(“预期值”,s,err.value)
json.decoder.JSONDecodeError:预期值:第1行第1列(字符0)
>>>j=json.loads(“123.6”)
>>>
json.load
需要一个字符串。当JSON解析器处理这个字符串时,剩下的是foo.com
,这是一个无效的标记。这是本例的一个边缘情况:
json.loads('{a: 1}')
你不会指望这会奏效吧<代码>a是无效的令牌
为此,我们需要另一组报价:
print(json.loads('"foo.com"'))
# foo.com
引用定义JSON的RFC7159: 以下是六个结构特征:
begin-array = ws %x5B ws ; [ left square bracket
begin-object = ws %x7B ws ; { left curly bracket
end-array = ws %x5D ws ; ] right square bracket
end-object = ws %x7D ws ; } right curly bracket
name-separator = ws %x3A ws ; : colon
value-separator = ws %x2C ws ; , comma
JSON值必须是对象、数组、数字或字符串,或者
以下三个文字名称:
false null true
不允许使用其他文字名称
value = false / null / true / object / array / number / string
object = begin-object [ member *( value-separator member ) ]
end-object
array = begin-array [ value *( value-separator value ) ] end-array
number = [ minus ] int [ frac ] [ exp ]
string = quotation-mark *char quotation-mark
如您所见,输入foo.com
不满足以下任何条件:
- 它不是以
开始对象开始的
- 它也不是以
开始数组开始的
- 这也不是一个数字
- 它也不是字符串,因为它不是以
引号开头的
123.6
是一个数字:
123 . 6 == int frac
其中,根据RFC:
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
因此,
123。6
是一个值,所以它很好。因为123.6
是有效的JSON,但是foo.com
(没有引号!)不是?@ForceBru都被引用,因此都应该是字符串。@DeepSpace,因为语法不允许它:@FranzKafka,它们是Python的字符串,但不是JSON解析器。123.6
是有效的数字文本,“foo.com”
是有效的字符串文本,但foo.com
不是有效的JSON