0

Although the following seems to be a valid json string, I am unable to json.load it.

In [33]:  mystr="{ 'username': 'Newman Test Executor', 'channel': '#someslackchannel' }"

In [34]: json.loads(mystr)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-34-6f4efa0d20c6> in <module>()
----> 1 json.loads(mystr)

/usr/lib/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    337             parse_int is None and parse_float is None and
    338             parse_constant is None and object_pairs_hook is None and not kw):
--> 339         return _default_decoder.decode(s)
    340     if cls is None:
    341         cls = JSONDecoder

/usr/lib/python2.7/json/decoder.pyc in decode(self, s, _w)
    362 
    363         """
--> 364         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    365         end = _w(s, end).end()
    366         if end != len(s):

/usr/lib/python2.7/json/decoder.pyc in raw_decode(self, s, idx)
    378         """
    379         try:
--> 380             obj, end = self.scan_once(s, idx)
    381         except StopIteration:
    382             raise ValueError("No JSON object could be decoded")

ValueError: Expecting property name: line 1 column 3 (char 2)
pkaramol
  • 16,451
  • 43
  • 149
  • 324

4 Answers4

2

As both @Austin and @Arya mentioned above, you need to have double quotes in your JSON string to be valid. In your case, you could simply replace the single quote with a double quote:

import json
mystr="{ 'username': 'Newman Test Executor', 'channel': '#someslackchannel' }"
json.loads(mystr.replace('\'','"'))
Vasilis G.
  • 7,556
  • 4
  • 19
  • 29
2
import json
mystr = '{ "username": "Newman Test Executor", "channel": "#someslackchannel" }'
my_dict = { "username": "Newman Test Executor", "channel": "#someslackchannel" }



print(json.loads(mystr))
print(json.dumps(my_dict))

output:

{u'username': u'Newman Test Executor', u'channel': u'#someslackchannel'}
{"username": "Newman Test Executor", "channel": "#someslackchannel"}

Single quotes outside, double quotes inside incase of strings.

If you have no control over the json string being passed to you, you can use mystr.replace('\'', '"') as mentioned by Vasilis G.

Ramy M. Mousa
  • 5,727
  • 3
  • 34
  • 45
0

You need double quotes inside of the JSON string.

See Parsing string as JSON with single quotes?

The JSON standard requires double quotes and will not accept single quotes, nor will the parser.

Arya
  • 1,382
  • 2
  • 15
  • 36
0

Followed what Arya commented and got the code to work. Answer can be found in another forum though..

import json
mystr='{ "username": "Newman Test Executor","channel": "#someslackchannel"}'

json.loads(mystr)
Colton Neary
  • 80
  • 1
  • 9