为什么Python3 json.loads(";foo.com";)还不能工作,而json.loads(";123.6";)却不能工作?

为什么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

当我尝试加载“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" 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