27

I am trying to parse a JSON object into a Python dict. I've never done this before. When I googled this particular error, (What is wrong with the first char?), other posts have said that the string being loaded is not actually a JSON string. I'm pretty sure this is, though.

In this case, eval() works fine, but I'm wondering if there is a more appropriate way?

Note: This string comes directly from Twitter, via ptt tools.

>>> import json
>>> line = '{u\'follow_request_sent\': False, u\'profile_use_background_image\': True,
         u\'default_profile_image\': False, 
         u\'verified\': False, u\'profile_sidebar_fill_color\': u\'DDEEF6\',
         u\'profile_text_color\': u\'333333\', u\'listed_count\': 0}'
>>> json.loads(line)

Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 326, in loads
       return _default_decoder.decode(s)
     File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
       obj, end = self.raw_decode(s, idx=_w(s, 0).end())
     File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode
       obj, end = self.scan_once(s, idx)
   ValueError: Expecting property name: line 1 column 1 (char 1)
fragilewindows
  • 1,394
  • 1
  • 15
  • 26
gabe
  • 2,521
  • 2
  • 25
  • 37

4 Answers4

29

That's definitely not JSON - not as printed above anyhow. It's already been parsed into a Python object - JSON would have false, not False, and wouldn't show strings as u for unicode (all JSON strings are unicode). Are you sure you're not getting your json string turned into a Python object for free somewhere in the chain already, and thus loading it into json.loads() is obviously wrong because in fact it's not a string?

Nick Bastin
  • 30,415
  • 7
  • 59
  • 78
28

Sometimes you can have this error because your string values are not well recognized by python. As an example: I've spent quite a lot of time searching for the origin of this kind of error. Here is what I found.

Sometimes a language recognizes a kind of quotes and not another one: btw, to parse a string in to json in JavaScript all quotes have to be in the ' format

to parse a string into json in JavaScript all quotes have to be in the " format which is not really logic.

Hopefully you can use the replace function. For Python:

json.loads(s.replace("\'", '"'));

Hope it will save you the time I've spent hunting this bug!

Rickest Rick
  • 1,519
  • 1
  • 15
  • 28
gronaz
  • 399
  • 4
  • 10
  • The part of your answer regarding the quotes in JSON in JavaScript looks a bit contradictory. I went ahead and [tested](https://jsbin.com/pupayajoni/1/edit?js,console) both variants in JavaScript (in Chrome). The result is: your third paragraph is right: the standard JavaScript parser doesn't allow single quotes as string literal boundaries. – Андрей Беньковский Mar 23 '16 at 17:43
  • 1
    BTW [The JSON specification](http://www.json.org) only allows strings wrapped in double quotes so this behaviour isn't specific to JavaScript and Python JSON parsers. – Андрей Беньковский Mar 23 '16 at 17:45
  • thank you!!.. it worked! – Brian Sanchez Mar 10 '17 at 01:25
7

I got this error when I had a hanging comma at the end of a list of properties. Because of the comma it was expecting another property name but there was none.

Ian Danforth
  • 779
  • 1
  • 9
  • 18
  • 1
    Such a dumb thing that JSON doesn't allow trailing commas! And and an absolute no-go that json.load gives you only `ValueError: Expecting property name enclosed in double quotes` – Ufos Oct 21 '16 at 12:07
0

Make sure that your JSON file does not have lines start with // (which wrongfully supposed to comments!). I have the same ValueError message and it's gone after I removed the // from my file.

Aziz Alto
  • 19,057
  • 5
  • 77
  • 60