it-swarm.com.de

JSON ValueError: Name der Eigenschaft erwartet: Zeile 1 Spalte 2 (Char 1)

Ich habe Probleme mit json.loads zum Konvertieren in ein Diktierobjekt und ich kann nicht herausfinden, was ich falsch mache 

ValueError: Expecting property name: line 1 column 2 (char 1)

Hier ist mein Code:

__author__ = 'xxdpavelxx'
from kafka.client import KafkaClient
from kafka.consumer import SimpleConsumer
from kafka.producer import SimpleProducer, KeyedProducer
import pymongo
from pymongo import MongoClient
import json

c = MongoClient("54.210.157.57")
db = c.test_database3
collection = db.Tweet_col

kafka = KafkaClient("54.210.157.57:9092")

consumer = SimpleConsumer(kafka,"myconsumer","test")
for Tweet in consumer:
    print Tweet.message.value
    jsonTweet=json.loads(({u'favorited': False, u'contributors': None})
    collection.insert(jsonTweet)

Ich bin mir ziemlich sicher, dass der Fehler in der zweiten bis letzten Zeile auftritt 

jsonTweet=json.loads({u'favorited': False, u'contributors': None})

aber ich weiß nicht, was ich tun soll, um das Problem zu beheben. Jeder Rat wäre dankbar.

64
dredbound

json.loads lädt einen Json-String in einen Python dict, json.dumps wird einen Python dict in einen Json-String ausgeben.

>>> json_string = '{"favorited": false, "contributors": null}'
'{"favorited": false, "contributors": null}'
>>> value = json.loads(json_string)
{u'favorited': False, u'contributors': None}
>>> json_dump = json.dumps(value)
'{"favorited": false, "contributors": null}'

Diese Zeile ist also falsch, da Sie load einen Python dict suchen und json.loads einen gültigen json string erwartet, der <type 'str'> haben sollte. 

Wenn Sie also versuchen, den Json zu laden, sollten Sie ändern, was Sie laden, um den json_string oben auszusehen, oder Sie sollten es ausgeben. Dies ist nur meine beste Vermutung aus den gegebenen Informationen. Was versuchen Sie zu erreichen?

Sie müssen auch nicht die Variable u vor Ihren Zeichenfolgen angeben, wie @Cld in den Kommentaren erwähnt.

68
Yep_It's_Me

Ich bin auf ein anderes Problem gestoßen, das den gleichen Fehler zurückgibt.

Einzelzitat Ausgabe

Ich habe einen Json-String mit einfachen Anführungszeichen verwendet: 

{
    'property': 1
}

json.loads akzeptiert jedoch nur doppelte Anführungszeichen für json-Eigenschaften

{
    "property": 1
}

Letzte Komma-Ausgabe

json.loads akzeptiert kein abschließendes Komma:

{
  "property": "text", 
  "property2": "text2",
}

Lösung: ast zur Lösung einzelner Anführungszeichen und endgültiger Kommata

Sie können ast (Teil der Standardbibliothek für Python 2 und 3) für diese Verarbeitung verwenden. Hier ist ein Beispiel :

import ast
# ast.literal_eval() return a dict object, we must use json.dumps to get JSON string
import json

# Single quote to double with ast.literal_eval()
json_data = "{'property': 'text'}"
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property": "text"}

# ast.literal_eval() with double quotes
json_data = '{"property": "text"}'
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property": "text"}

# ast.literal_eval() with final coma
json_data = "{'property': 'text', 'property2': 'text2',}"
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property2": "text2", "property": "text"}

Die Verwendung von ast verhindert, dass Sie Probleme mit einem einfachen Anführungszeichen und dem Komma finden.

json.dumps mit einfachen Anführungszeichen

Um json.dumps mit einfachen Anführungszeichen zu verwenden, können Sie diesen Code verwenden:

import ast
import json

data = json.dumps(ast.literal_eval(json_data_single_quote))

ast Dokumentation

ast Python 3 doc

ast Python 2 doc

Ich hoffe, es hilft.

124
jedema
  1. ersetzen Sie alle einfachen Anführungszeichen durch doppelte Anführungszeichen
  2. ersetzen Sie "u" von Ihren Zeichenfolgen durch "". Konvertieren Sie also im Grunde interne Unicodes in Zeichenfolgen, bevor Sie die Zeichenfolge in json laden
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))
8
Vinay Pande

Alle anderen Antworten können Ihre Anfrage beantworten, aber ich hatte das gleiche Problem, das auf verirrte , zurückzuführen war, die ich am Ende meines json-Strings hinzugefügt habe:

{
 "key":"123sdf",
 "bus_number":"asd234sdf",
}

Ich habe es endlich zum Laufen gebracht, als ich zusätzlichen , wie folgt entfernte:

{
 "key":"123sdf",
 "bus_number":"asd234sdf"
}

Ich hoffe das hilft! Prost.

3

verwendet ast, Beispiel

In [15]: a = "[{'start_city': '1', 'end_city': 'aaa', 'number': 1},\
...:      {'start_city': '2', 'end_city': 'bbb', 'number': 1},\
...:      {'start_city': '3', 'end_city': 'ccc', 'number': 1}]"
In [16]: import ast
In [17]: ast.literal_eval(a)
Out[17]:
[{'end_city': 'aaa', 'number': 1, 'start_city': '1'},
 {'end_city': 'bbb', 'number': 1, 'start_city': '2'},
 {'end_city': 'ccc', 'number': 1, 'start_city': '3'}]
0
xin.chen