Python analizando JSON con comillas dobles escapadas

Considera este json válido:

{"a": 1, "b": "{\"c\":2}"}

El módulo json de Python se lanza cuando bash analizarlo. Parece que el \" está desechando:

 json.loads ('{"a": 1, "b": "{\" c \ ": 2}"}')
 Rastreo (llamadas recientes más última):
   Archivo "", línea 1, en 
   Archivo "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", línea 338, en cargas
     devuelve _default_decoder.decode (s)
   Archivo "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", línea 365, en deencoding
     obj, end = self.raw_decode (s, idx = _w (s, 0) .end ())
   Archivo "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", línea 381, en raw_decode
     obj, end = self.scan_once (s, idx)
 ValueError: Esperando, delimitador: línea 1 columna 15 (carácter 14)

¿Hay alguna forma de analizar esto en Python, ya sea utilizando el módulo json o algún otro módulo como ujson ?

En realidad no importa con dobles comillas escapadas. Mira mi prueba

 >>> json.loads('{"a": 1, "b": "{\"c\":2}"}') Traceback (most recent call last): File "", line 1, in  File "/usr/lib/python3.4/json/__init__.py", line 318, in loads return _default_decoder.decode(s) File "/usr/lib/python3.4/json/decoder.py", line 343, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/python3.4/json/decoder.py", line 359, in raw_decode obj, end = self.scan_once(s, idx) ValueError: Expecting ',' delimiter: line 1 column 18 (char 17) >>> json.loads('{"a": 1, "b": "{"c":2}"}') Traceback (most recent call last): File "", line 1, in  File "/usr/lib/python3.4/json/__init__.py", line 318, in loads return _default_decoder.decode(s) File "/usr/lib/python3.4/json/decoder.py", line 343, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/python3.4/json/decoder.py", line 359, in raw_decode obj, end = self.scan_once(s, idx) ValueError: Expecting ',' delimiter: line 1 column 18 (char 17) >>> json.loads('{"a": 1, "b": {"c":2}}') {'a': 1, 'b': {'c': 2}} >>> json.loads('{"a": 1, "b": {\"c\":2}}') {'a': 1, 'b': {'c': 2}} >>> 

Dentro de una cadena entre comillas, \" se trata de la misma manera que una cita regular:

 >>> '{"a": 1, "b": "{\"c\":2}"}' '{"a": 1, "b": "{"c":2}"}' 

Como resultado, su cadena no es JSON válida.

También debes escapar de las barras invertidas, para que se envíen a las loads . Puedes ver esto codificando tu diccionario deseado con dumps :

 >>> json.dumps({"a": 1, "b": "{\"c\": 2}"}) '{"a": 1, "b": "{\\"c\\": 2}"}' >>> json.loads('{"a": 1, "b": "{\\"c\\": 2}"}') {u'a': 1, u'b': u'{"c": 2}'}