Python / Json: Erwarten des Eigenschaftsnamens in doppelten Anführungszeichen

102

Ich habe versucht, einen guten Weg zu finden, um JSON-Objekte in Python zu laden. Ich sende diese JSON-Daten:

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

zum Backend, wo es als String empfangen wird, habe ich dann verwendet json.loads(data) dann analysiert.

Aber jedes Mal bekam ich die gleiche Ausnahme:

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

Ich habe es gegoogelt, aber außer dieser Lösung scheint nichts zu funktionieren json.loads(json.dumps(data)) die mir persönlich nicht so effizient erscheint, da sie jede Art von Daten akzeptiert, auch solche, die nicht im JSON-Format vorliegen.

Anregungen werden sehr geschätzt.

raeX
quelle
18
Mein Fehler war keine doppelte Anführungszeichen. Ich habe nach dem letzten Schlüssel-Wert-Paar ein Komma eingefügt, wie wir es in Python tun. Das machen Sie in JSON nicht.
Luv33preet
4
Verwenden Sie immerjson.dumps() Python, anstatt nur zu schreiben, und hoffen Sie, dass die Python-Notation in Ihrem JavaScript-Reader funktioniert.
vy32
Ich hatte dieses Problem, weil ich das Ergebnis von a genommen print(jsonpickle_deserialized_object_string)und versucht habe, es zu verwenden. Aus irgendeinem Grund print()ändert die Zitate aus "zu'
StingyJack
@ Luv33preet, danke, habe es gelöst. aber ich erwarte logger-msg als fehlendes Komma oder so, aber dieser Fehler sagt nichts darüber aus,
ganeshdeshmukh

Antworten:

145

Dies:

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

ist nicht JSON.
Dies:

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

ist JSON.

EDIT:
Einige Kommentatoren schlugen vor, dass das oben genannte nicht ausreicht.
JSON-Spezifikation - RFC7159 gibt an, dass eine Zeichenfolge mit einem Anführungszeichen beginnt und endet. Das ist ".
Einzelne Quoute 'hat in JSON keine semantische Bedeutung und ist nur innerhalb einer Zeichenfolge zulässig.

ElmoVanKielmo
quelle
4
Danke :) Ich habe nicht darauf geachtet, ich verwende beim Senden der Daten das richtige JSON-Format, aber wenn es im Backend empfangen wird, werden die doppelten Anführungszeichen durch einfache ersetzt! Deshalb habe ich diese Ausnahme.
RaeX
20
Dies ist keine Lösung. Eine Lösung würde ihm sagen, wie er den String in einen gültigen JSON ändern kann.
FistOfFury
1
@FistOfFury Es tut mir leid, aber Ihre Aussage basiert auf einer falschen Annahme, dass eine beliebige ungültige JSON-Zeichenfolge programmgesteuert zuverlässig in eine gültige Zeichenfolge umgewandelt werden kann. Viele Antworten auf diese Frage versuchen, das Problem durch Ersetzen von "durch" usw. zu lösen. Muss ich Ihnen einfache Beispiele für Eingabezeichenfolgen geben, die diese "Lösungen" zerstören? Anscheinend hat OP verstanden, dass es sich nicht um das handelt, womit wir es zu tun haben JSON und konnte fortfahren - akzeptierte meine Antwort. Hinweis - Die Eingabezeichenfolge ähnelt eher der Ausgabe der Python dict .__ repr __ () -Methode.
ElmoVanKielmo
4
@ElmoVanKielmo ändert nichts an der Tatsache, dass Ihre Antwort eine Aussage ist, keine Antwort auf die Frage. Sie geben keinen Kontext oder eine Erklärung an. Leute, die hierher kommen und nach Informationen über die Frage suchen, werden enttäuscht sein. Sie haben vielleicht OP geholfen, aber andere nicht so sehr.
FistOfFury
43

Da JSON nur das Einschließen von Zeichenfolgen in doppelte Anführungszeichen zulässt, können Sie die Zeichenfolge folgendermaßen bearbeiten:

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

Dadurch werden alle Vorkommen von einfachen Anführungszeichen durch doppelte Anführungszeichen in der JSON-Zeichenfolge ersetzt str.

Sie können auch verwenden, js-beautifywas weniger streng ist:

$ pip install jsbeautifier
$ js-beautify file.js
Elig
quelle
3
Keine gute Idee, da es alle durch "s" ersetzen kann, was falsch ist: BEISPIEL: "es ist schlecht" -> "es ist schlecht" -> fehlerhafter String
Reihan_amn
30

In meinem Fall waren doppelte Anführungszeichen kein Problem.

Das letzte Komma gab mir die gleiche Fehlermeldung.

{'a':{'b':c,}}
           ^

Um dieses Komma zu entfernen, habe ich einen einfachen Code geschrieben.

import json

with open('a.json','r') as f:
    s = f.read()
    s = s.replace('\t','')
    s = s.replace('\n','')
    s = s.replace(',}','}')
    s = s.replace(',]',']')
    data = json.loads(s)

Und das hat bei mir funktioniert.

greentec
quelle
4
+1 Ich kann das bestätigen. Das nachfolgende Komma erzeugt diese Fehlermeldung. Beispiel: echo '{"json":"obj",}' | python -m json.tool Wenn in der Shell ausgeführt, wird "Erwarteter Eigenschaftsname in doppelten Anführungszeichen eingeschlossen: Zeile 1, Spalte 15 (Zeichen 14)" angegeben. Nachgestellte Kommas sind kein legales JSON, aber es wäre schön, wenn das Python-JSON-Modul in diesem Fall eine relevante Fehlermeldung ausgeben würde.
Laryx Decidua
7

Ganz einfach, diese Zeichenfolge ist kein gültiger JSON. Wie der Fehler besagt, müssen JSON-Dokumente doppelte Anführungszeichen verwenden.

Sie müssen die Datenquelle festlegen.

Daniel Roseman
quelle
6

Ich habe Ihre JSON-Daten überprüft

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

in http://jsonlint.com/ und die Ergebnisse waren:

Error: Parse error on line 1:
{   'http://example.org/
--^
Expecting 'STRING', '}', got 'undefined'

Wenn Sie es in die folgende Zeichenfolge ändern, wird der JSON-Fehler behoben:

{
    "http://example.org/about": {
        "http://purl.org/dc/terms/title": [{
            "type": "literal",
            "value": "Anna's Homepage"
        }]
    }
}
Yaron
quelle
2
DANKE FÜR DIESEN LINK!
WolVes
6

JSON-Zeichenfolgen müssen doppelte Anführungszeichen verwenden. Die JSON-Python-Bibliothek erzwingt dies, sodass Sie Ihre Zeichenfolge nicht laden können. Ihre Daten müssen folgendermaßen aussehen:

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

Wenn Sie dies nicht tun können, können Sie ast.literal_eval()stattdessen verwendenjson.loads()

alexbclay
quelle
3
Dies ist keine Einschränkung der Python-Bibliothek, sondern des JSON-Formats.
Daniel Roseman
Du hast Recht. Einige JSON-Parser erzwingen jedoch keine doppelten Anführungszeichen. Ich werde meine Antwort aktualisieren.
Alexbclay
vorausgesetzt, dieser Nicht-JSON enthält niemals doppelte Anführungszeichen in Zeichenfolgen in einfachen Anführungszeichen. Alles, was Sie tun müssen, ist, alle Singles vor dem Aufrufen durch doppelte zu json.loads()
ersetzen
2
Die Verwendung ast.literal_evalführt dazu, ValueError: malformed stringdass die JSON-Zeichenfolge einen booleschen Wert hat.
Scratch'N'Purr
4
import ast

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

json_data = ast.literal_eval(json.dumps(inpt))

print(json_data)

Dies wird das Problem lösen.

balaji k
quelle
3

Wie es fälschlicherweise klar heißt, sollten Namen in doppelte Anführungszeichen anstatt in einfache Anführungszeichen gesetzt werden. Die übergebene Zeichenfolge ist einfach kein gültiger JSON. Es sollte so aussehen

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

Ich habe diese Methode verwendet und es geschafft, die gewünschte Ausgabe zu erhalten. mein Skript

x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}"

x = x.replace("'", '"')
j = json.loads(x)
print(j['keys-value'])

Ausgabe

>>> 0
Hamed
quelle
2
with open('input.json','r') as f:
    s = f.read()
    s = s.replace('\'','\"')
    data = json.loads(s)

Das hat bei mir sehr gut funktioniert. Vielen Dank.

rohit9786
quelle
2
x = x.replace("'", '"')
j = json.loads(x)

Dies ist zwar die richtige Lösung, aber es kann zu Kopfschmerzen führen, wenn es einen JSON wie diesen gibt -

{'status': 'success', 'data': {'equity': {'enabled': True, 'net': 66706.14510000008, 'available': {'adhoc_margin': 0, 'cash': 1277252.56, 'opening_balance': 1277252.56, 'live_balance': 66706.14510000008, 'collateral': 249823.93, 'intraday_payin': 15000}, 'utilised': {'debits': 1475370.3449, 'exposure': 607729.3129, 'm2m_realised': 0, 'm2m_unrealised': -9033, 'option_premium': 0, 'payout': 0, 'span': 858608.032, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 249823.93}}, 'commodity': {'enabled': True, 'net': 0, 'available': {'adhoc_margin': 0, 'cash': 0, 'opening_balance': 0, 'live_balance': 0, 'collateral': 0, 'intraday_payin': 0}, 'utilised': {'debits': 0, 'exposure': 0, 'm2m_realised': 0, 'm2m_unrealised': 0, 'option_premium': 0, 'payout': 0, 'span': 0, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 0}}}}

Haben Sie diesen "wahren" Wert bemerkt ? Verwenden Sie diese Option, um sicherzustellen, dass die Dinge doppelt auf Boolesche Werte überprüft werden. Dies wird diese Fälle abdecken -

x = x.replace("'", '"').replace("True", '"True"').replace("False", '"False"').replace("null", '"null"')
j = json.loads(x)

Stellen Sie außerdem sicher, dass Sie nicht machen

x = json.loads(x)

Es muss eine andere Variable sein.

Amit Ghosh
quelle
1

Ich hatte ein ähnliches Problem. Zwei miteinander kommunizierende Komponenten verwendeten eine Warteschlange.

Die erste Komponente hat json.dumps nicht ausgeführt, bevor die Nachricht in die Warteschlange gestellt wurde. Die durch das Empfangen der Komponente generierte JSON-Zeichenfolge stand also in einfachen Anführungszeichen. Dies verursachte einen Fehler

 Expecting property name enclosed in double quotes

Durch das Hinzufügen von json.dumps wurde das korrekt formatierte JSON erstellt und das Problem behoben.

Rahul Bagal
quelle
1

Verwenden Sie die evalFunktion.

Es wird die Diskrepanz zwischen einfachen und doppelten Anführungszeichen behoben.

msamogh
quelle
0

Wie die anderen Antworten gut erklären, tritt der Fehler aufgrund ungültiger Anführungszeichen auf, die an das json-Modul übergeben wurden.

In meinem Fall habe ich den ValueError auch nach dem Ersetzen 'durch "in meiner Zeichenfolge weiterhin erhalten. Endlich wurde mir klar, dass einige zitierähnliche Unicode-Symbole ihren Weg in meine Zeichenfolge gefunden hatten:

           `  ´     

Um all dies zu bereinigen, können Sie Ihren String einfach durch einen regulären Ausdruck führen:

import re

raw_string = '{“key”:“value”}'

parsed_string = re.sub(r"[“|”|‛|’|‘|`|´|″|′|']", '"', my_string)

json_object = json.loads(parsed_string)
Anders Solberg
quelle
-1

Ich bin mehrmals auf dieses Problem gestoßen, als der JSON von Hand bearbeitet wurde. Wenn jemand etwas aus der Datei löschen sollte, ohne es zu bemerken, kann dies den gleichen Fehler auslösen.

Wenn beispielsweise Ihr letztes JSON "}" fehlt, wird derselbe Fehler ausgegeben.

Wenn Sie Ihre Datei von Hand bearbeiten, stellen Sie sicher, dass Sie sie so formatieren, wie es vom JSON-Decoder erwartet wird. Andernfalls tritt das gleiche Problem auf.

Hoffe das hilft!

Sneil
quelle
-2

Es ist immer ideal, die json.dumps()Methode zu verwenden. Um diesen Fehler zu beseitigen, habe ich den folgenden Code verwendet

json.dumps(YOUR_DICT_STRING).replace("'", '"')
Michael Elimu
quelle