Python/Json: se espera el nombre de la propiedad entre comillas dobles

Resuelto raeX asked hace 8 años • 33 respuestas

He estado intentando encontrar una buena manera de cargar objetos JSON en Python. Envío estos datos json:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

al backend donde se recibirá como una cadena y luego solía json.loads(data)analizarlo.

Pero cada vez obtuve la misma excepción:

ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

Lo busqué en Google pero nada parece funcionar aparte de esta solución json.loads(json.dumps(data))que personalmente no me parece tan eficiente ya que acepta cualquier tipo de datos, incluso los que no están en formato json.

Cualquier sugerencia será muy apreciada.

raeX avatar Sep 14 '16 20:09 raeX
Aceptado

Este:

{
    'http://example.org/about': {
        'http://purl.org/dc/terms/title': [
            {'type': 'literal', 'value': "Anna's Homepage"}
        ]
     }
}

no es JSON.
Este:

{
     "http://example.org/about": {
         "http://purl.org/dc/terms/title": [
             {"type": "literal", "value": "Anna's Homepage"}
          ]
      }
}

es JSON.

EDITAR:
Algunos comentaristas sugirieron que lo anterior no es suficiente.
Especificación JSON: RFC7159 establece que una cadena comienza y termina con comillas. Eso es ".
Las comillas simples 'no tienen significado semántico en JSON y solo se permiten dentro de una cadena.

ElmoVanKielmo avatar Sep 14 '2016 13:09 ElmoVanKielmo

Como JSON solo permite encerrar cadenas entre comillas dobles, puedes manipular la cadena de esta manera:

s = s.replace("\'", "\"")

Si su JSON contiene comillas simples escapadas ( \'), entonces debería usar el siguiente código más preciso:

import re
p = re.compile('(?<!\\\\)\'')
s = p.sub('\"', s)

Esto reemplazará todas las apariciones de comillas simples con comillas dobles en la cadena JSON sy, en el último caso, no reemplazará las comillas simples escapadas.

También puedes usar js-beautifycuál es menos estricto:

$ pip install jsbeautifier
$ js-beautify file.js
elig avatar May 09 '2018 15:05 elig