Mam problem z używaniem json.loads do konwersji na obiekt dict i nie mogę dowiedzieć się, co robię źle.
ValueError: Expecting property name: line 1 column 2 (char 1)
Oto mój kod:
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)
Jestem prawie pewien, że błąd występuje w drugim do ostatniego wierszu
jsonTweet=json.loads({u'favorited': False, u'contributors': None})
ale nie wiem, co zrobić, żeby to naprawić. Każda rada będzie mile widziana.
"
czy to błąd kopiowania wklejania?print tweet.message.value
?ValueError
jest z powodu błędu w danych wejściowych JSON, a nie problemu w kodzie. (Oprócz zaginionego,"
który powinien normalnie wysłać,SyntaxError
więc zakładam, że to tylko błąd kopiowania wklejania.)Odpowiedzi:
json.loads
załaduje ciąg json do pythonadict
,json.dumps
zrzuci pythondict
do łańcucha json, na przykład:Więc ta linia jest niepoprawna, ponieważ próbujesz
load
użyć Pythonadict
ijson.loads
oczekuje prawidłowego,json string
który powinien mieć<type 'str'>
.Więc jeśli próbujesz załadować json, powinieneś zmienić to, co ładujesz, aby wyglądało jak
json_string
powyżej, lub powinieneś to zrzucić. To tylko moje najlepsze przypuszczenie na podstawie podanych informacji. Co próbujesz osiągnąć?Nie musisz także określać
u
przed znakami, jak wspomniano w komentarzach @Cld.źródło
Napotkałem inny problem, który zwraca ten sam błąd.
Problem z pojedynczą wyceną
Użyłem łańcucha json z pojedynczymi cudzysłowami :
Ale
json.loads
akceptuje tylko podwójne cudzysłowy dla właściwości json :Ostatni problem z przecinkiem
json.loads
nie akceptuje ostatniego przecinka:Rozwiązanie:
ast
aby rozwiązać problemy z pojedynczym cytatem i ostatnim przecinkiemMożesz użyć
ast
(część standardowej biblioteki dla Pythona 2 i 3) do tego przetwarzania. Oto przykład :Użycie
ast
zapobiegnie problemom z pojedynczymi cudzysłowami i końcowymi przecinkami, interpetując JSON, tak jak słownik Pythona (więc musisz postępować zgodnie ze składnią słownika Pythona). To całkiem dobra i bezpieczna alternatywaeval()
funkcji dla struktur literalnych.Dokumentacja Pythona ostrzegła nas przed użyciem dużego / złożonego ciągu:
json.dumps z pojedynczymi cudzysłowami
Aby
json.dumps
łatwo używać pojedynczych cudzysłowów, możesz użyć tego kodu:ast
dokumentacjaast Python 3 doc
ast Python 2 doc
Narzędzie
Jeśli często edytujesz JSON, możesz użyć CodeBeautify . Pomaga naprawić błąd składni i zminimalizować / upiększyć JSON.
Mam nadzieję, że to pomoże.
źródło
źródło
Wszystkie inne odpowiedzi mogą odpowiedzieć na twoje zapytanie, ale napotkałem ten sam problem, który był spowodowany błędem,
,
który dodałem na końcu mojego ciągu json w następujący sposób:W końcu działało, kiedy usunąłem dodatkowe w
,
ten sposób:Mam nadzieję, że to pomoże! Twoje zdrowie.
źródło
używany ast, przykład
źródło
Inny przypadek, w którym spotkałem się z tym, miał miejsce, gdy użyłem
echo
do przesłania kodu JSON do mojego skryptu w Pythonie i niedbale zawiniłem ciąg JSON w podwójne cudzysłowy:Zauważ, że sam ciąg JSON zawiera cudzysłowy i powinienem był zrobić:
Jak to było, to co otrzymał skrypt python:
{thumbnailWidth: 640}
; podwójne cudzysłowy zostały skutecznie usunięte.źródło