Why does Python 3 json.loads(“foo.com”) not work yet json.loads(“123.6”) does?
When I try to load "foo.com" I get an exception, as expected; however, if I am loading a string containing a float number, it works. Just trying to figure out why this is the case.
$ 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")
>>>
json python-3.x
add a comment |
When I try to load "foo.com" I get an exception, as expected; however, if I am loading a string containing a float number, it works. Just trying to figure out why this is the case.
$ 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")
>>>
json python-3.x
Because123.6
is valid JSON, butfoo.com
(without quotes!) is not?
– ForceBru
Nov 15 '18 at 21:20
@ForceBru Both are quoted, therefore both should be strings.
– Franz Kafka
Nov 15 '18 at 21:23
@DeepSpace, because the grammar doesn't allow it: tools.ietf.org/html/rfc7159#section-2
– ForceBru
Nov 15 '18 at 21:25
@FranzKafka, they're strings for Python, but not the JSON parser.
– ForceBru
Nov 15 '18 at 21:26
123.6
is a valid number literal,"foo.com"
is a valid string literal, butfoo.com
isn't valid json
– mata
Nov 15 '18 at 21:33
add a comment |
When I try to load "foo.com" I get an exception, as expected; however, if I am loading a string containing a float number, it works. Just trying to figure out why this is the case.
$ 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")
>>>
json python-3.x
When I try to load "foo.com" I get an exception, as expected; however, if I am loading a string containing a float number, it works. Just trying to figure out why this is the case.
$ 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")
>>>
json python-3.x
json python-3.x
asked Nov 15 '18 at 21:17
Franz KafkaFranz Kafka
149120
149120
Because123.6
is valid JSON, butfoo.com
(without quotes!) is not?
– ForceBru
Nov 15 '18 at 21:20
@ForceBru Both are quoted, therefore both should be strings.
– Franz Kafka
Nov 15 '18 at 21:23
@DeepSpace, because the grammar doesn't allow it: tools.ietf.org/html/rfc7159#section-2
– ForceBru
Nov 15 '18 at 21:25
@FranzKafka, they're strings for Python, but not the JSON parser.
– ForceBru
Nov 15 '18 at 21:26
123.6
is a valid number literal,"foo.com"
is a valid string literal, butfoo.com
isn't valid json
– mata
Nov 15 '18 at 21:33
add a comment |
Because123.6
is valid JSON, butfoo.com
(without quotes!) is not?
– ForceBru
Nov 15 '18 at 21:20
@ForceBru Both are quoted, therefore both should be strings.
– Franz Kafka
Nov 15 '18 at 21:23
@DeepSpace, because the grammar doesn't allow it: tools.ietf.org/html/rfc7159#section-2
– ForceBru
Nov 15 '18 at 21:25
@FranzKafka, they're strings for Python, but not the JSON parser.
– ForceBru
Nov 15 '18 at 21:26
123.6
is a valid number literal,"foo.com"
is a valid string literal, butfoo.com
isn't valid json
– mata
Nov 15 '18 at 21:33
Because
123.6
is valid JSON, but foo.com
(without quotes!) is not?– ForceBru
Nov 15 '18 at 21:20
Because
123.6
is valid JSON, but foo.com
(without quotes!) is not?– ForceBru
Nov 15 '18 at 21:20
@ForceBru Both are quoted, therefore both should be strings.
– Franz Kafka
Nov 15 '18 at 21:23
@ForceBru Both are quoted, therefore both should be strings.
– Franz Kafka
Nov 15 '18 at 21:23
@DeepSpace, because the grammar doesn't allow it: tools.ietf.org/html/rfc7159#section-2
– ForceBru
Nov 15 '18 at 21:25
@DeepSpace, because the grammar doesn't allow it: tools.ietf.org/html/rfc7159#section-2
– ForceBru
Nov 15 '18 at 21:25
@FranzKafka, they're strings for Python, but not the JSON parser.
– ForceBru
Nov 15 '18 at 21:26
@FranzKafka, they're strings for Python, but not the JSON parser.
– ForceBru
Nov 15 '18 at 21:26
123.6
is a valid number literal, "foo.com"
is a valid string literal, but foo.com
isn't valid json– mata
Nov 15 '18 at 21:33
123.6
is a valid number literal, "foo.com"
is a valid string literal, but foo.com
isn't valid json– mata
Nov 15 '18 at 21:33
add a comment |
2 Answers
2
active
oldest
votes
Quote from RFC7159 that defines JSON:
These are the six structural characters:
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
A JSON value MUST be an object, array, number, or string, or one of
the following three literal names:false null true
<...> No other literal names are allowed.
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
As you can see, the input foo.com
does not satisfy any of that:
- it doesn't start with a
begin-object
- nor does it start with a
begin-array
- nor is it a number
- nor is it a string, because it does not start with a
quotation-mark
However, 123.6
is a number:
123 . 6 == int frac
where, as per the RFC:
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
Thus, 123 . 6
is a value
, so it's fine.
add a comment |
json.loads
expects a string. When the JSON parser handles this string all is left is foo.com
which is an invalid token. It's an edge case of this example:
json.loads('a: 1')
You would not expect this to work, wouldn't you? a
is an invalid token.
For this to work we will need another set of quotes:
print(json.loads('"foo.com"'))
# foo.com
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53328019%2fwhy-does-python-3-json-loadsfoo-com-not-work-yet-json-loads123-6-does%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Quote from RFC7159 that defines JSON:
These are the six structural characters:
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
A JSON value MUST be an object, array, number, or string, or one of
the following three literal names:false null true
<...> No other literal names are allowed.
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
As you can see, the input foo.com
does not satisfy any of that:
- it doesn't start with a
begin-object
- nor does it start with a
begin-array
- nor is it a number
- nor is it a string, because it does not start with a
quotation-mark
However, 123.6
is a number:
123 . 6 == int frac
where, as per the RFC:
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
Thus, 123 . 6
is a value
, so it's fine.
add a comment |
Quote from RFC7159 that defines JSON:
These are the six structural characters:
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
A JSON value MUST be an object, array, number, or string, or one of
the following three literal names:false null true
<...> No other literal names are allowed.
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
As you can see, the input foo.com
does not satisfy any of that:
- it doesn't start with a
begin-object
- nor does it start with a
begin-array
- nor is it a number
- nor is it a string, because it does not start with a
quotation-mark
However, 123.6
is a number:
123 . 6 == int frac
where, as per the RFC:
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
Thus, 123 . 6
is a value
, so it's fine.
add a comment |
Quote from RFC7159 that defines JSON:
These are the six structural characters:
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
A JSON value MUST be an object, array, number, or string, or one of
the following three literal names:false null true
<...> No other literal names are allowed.
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
As you can see, the input foo.com
does not satisfy any of that:
- it doesn't start with a
begin-object
- nor does it start with a
begin-array
- nor is it a number
- nor is it a string, because it does not start with a
quotation-mark
However, 123.6
is a number:
123 . 6 == int frac
where, as per the RFC:
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
Thus, 123 . 6
is a value
, so it's fine.
Quote from RFC7159 that defines JSON:
These are the six structural characters:
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
A JSON value MUST be an object, array, number, or string, or one of
the following three literal names:false null true
<...> No other literal names are allowed.
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
As you can see, the input foo.com
does not satisfy any of that:
- it doesn't start with a
begin-object
- nor does it start with a
begin-array
- nor is it a number
- nor is it a string, because it does not start with a
quotation-mark
However, 123.6
is a number:
123 . 6 == int frac
where, as per the RFC:
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
Thus, 123 . 6
is a value
, so it's fine.
answered Nov 15 '18 at 21:33
ForceBruForceBru
20.3k83254
20.3k83254
add a comment |
add a comment |
json.loads
expects a string. When the JSON parser handles this string all is left is foo.com
which is an invalid token. It's an edge case of this example:
json.loads('a: 1')
You would not expect this to work, wouldn't you? a
is an invalid token.
For this to work we will need another set of quotes:
print(json.loads('"foo.com"'))
# foo.com
add a comment |
json.loads
expects a string. When the JSON parser handles this string all is left is foo.com
which is an invalid token. It's an edge case of this example:
json.loads('a: 1')
You would not expect this to work, wouldn't you? a
is an invalid token.
For this to work we will need another set of quotes:
print(json.loads('"foo.com"'))
# foo.com
add a comment |
json.loads
expects a string. When the JSON parser handles this string all is left is foo.com
which is an invalid token. It's an edge case of this example:
json.loads('a: 1')
You would not expect this to work, wouldn't you? a
is an invalid token.
For this to work we will need another set of quotes:
print(json.loads('"foo.com"'))
# foo.com
json.loads
expects a string. When the JSON parser handles this string all is left is foo.com
which is an invalid token. It's an edge case of this example:
json.loads('a: 1')
You would not expect this to work, wouldn't you? a
is an invalid token.
For this to work we will need another set of quotes:
print(json.loads('"foo.com"'))
# foo.com
answered Nov 15 '18 at 21:31
DeepSpaceDeepSpace
39.5k44777
39.5k44777
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53328019%2fwhy-does-python-3-json-loadsfoo-com-not-work-yet-json-loads123-6-does%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Because
123.6
is valid JSON, butfoo.com
(without quotes!) is not?– ForceBru
Nov 15 '18 at 21:20
@ForceBru Both are quoted, therefore both should be strings.
– Franz Kafka
Nov 15 '18 at 21:23
@DeepSpace, because the grammar doesn't allow it: tools.ietf.org/html/rfc7159#section-2
– ForceBru
Nov 15 '18 at 21:25
@FranzKafka, they're strings for Python, but not the JSON parser.
– ForceBru
Nov 15 '18 at 21:26
123.6
is a valid number literal,"foo.com"
is a valid string literal, butfoo.com
isn't valid json– mata
Nov 15 '18 at 21:33