it-roy-ru.com

JSON ValueError: Ожидается имя свойства: строка 1, столбец 2 (символ 1)

У меня возникают проблемы с использованием json.loads для преобразования в объект dict, и я не могу понять, что я делаю неправильно. Точная ошибка, которую я получаю, это 

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

Вот мой код:

__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)

Я уверен, что ошибка происходит от 2-й до последней строки 

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

но я не знаю, что делать, чтобы это исправить. Любой совет будет принят во внимание.

64
dredbound

json.loads загрузит строку json в питон dict, json.dumps сбросит питон dict в строку json, например:

>>> 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}'

Так что эта строка неверна, так как вы пытаетесь load питона dict, а json.loads ожидает действительный json string, который должен иметь <type 'str'>

Так что, если вы пытаетесь загрузить json, вы должны изменить то, что вы загружаете, чтобы оно выглядело как json_string выше, или вы должны выбросить его. Это только мое лучшее предположение из приведенной информации. Что вы пытаетесь достичь?

Также вам не нужно указывать u перед вашими строками, как @Cld упомянул в комментариях.

68
Yep_It's_Me

Я столкнулся с другой проблемой, которая возвращает ту же ошибку.

Одиночная кавычка

Я использовал строку json с одинарные кавычки

{
    'property': 1
}

Но json.loads принимает только двойные кавычки для свойств json

{
    "property": 1
}

Последняя проблема с запятой

json.loads не принимает окончательную запятую:

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

Решение: ast для решения проблем с одинарными кавычками и запятыми

Вы можете использовать ast (часть стандартной библиотеки для Python 2 и 3) для этой обработки. Вот пример:

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"}

Использование ast предотвратит проблемы с одинарной кавычкой и запятой.

json.dumps с одинарными кавычками

Чтобы легко использовать json.dumps с одинарными кавычками, вы можете использовать этот код:

import ast
import json

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

ast документация

Ast Python 3 doc

Ast Python 2 док

Я надеюсь, что это помогает.

124
jedema
  1. заменить все одинарные кавычки на двойные
  2. заменить 'u "' из ваших строк на '"' ... так что в основном конвертируйте внутренние юникоды в строки перед загрузкой строки в json

    >> strs = "{u'key':u'val'}"

    >> strs = strs.replace("'",'"')

    >> json.loads(strs.replace('u"',''))

5
Vinay Pande

Все остальные ответы могут ответить на ваш запрос, но я столкнулся с той же проблемой, которая возникла из-за случайного ,, который я добавил в конец моей строки json, например так:

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

Я наконец заработал, когда убрал лишний , вот так:

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

Надеюсь, это поможет! веселит.

3
Rishabh Agrahari

используется ast, пример

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