2016-05-25 2 views
0

У меня проблема, я не могу понять. Я послав короткое JSon данные в виде строки с помощью Redis (в виде очереди) и приемник бросает следующее сообщение об ошибке:Ошибка Json: «конец за пределами границ»?

[ERROR JSON (in queue)] - {"ip": null, "domain": "somedomain.com", "name": "Some user name", "contact_id": 12345, "signature": 
"6f496a4eaba2c1ea4e371ea2c4951ad92f41ddf45ff4949ffa761b0648a22e38"} => end is out of bounds 

Код, который бросает исключение является следующее:

try: 
    item = json.loads(item[1]) 
except ValueError as e: 
    sys.stderr.write("[ERROR JSON (in queue)] - {1} => {0}\n".format(str(e), str(item))) 
    return None 

Что действительно странно, что если я открываю консоль питона и выполните следующие действия:

>>> import json 
>>> s = '{"ip": null, "domain": "somedomain.com", "name": "Some user name", "contact_id": 12345, "signature": "6f496a4eaba2c1ea4e371ea2c4951ad92f41ddf45ff4949ffa761b0648a22e38"}' 
>>> print s 

у меня нет вопроса, строки (копировать/вставить в консоли Python) не дают никаких ошибок на всех, но мой оригинальный код беспересадочный крыло один!

У вас есть идеи о том, что вызывает проблему?

ответ

4

Вы загружаете item[1], которая является вторым символом строки items:

>>> json.loads('"') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 381, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: end is out of bounds 

Вы должны написать:

item = json.loads(item) 
+0

Но что действительно странно, что эта проблема возникает лишь несколько раз , 'item' - это кортеж, содержащий ключ от Redis в 0 и значение (данные json) в 1. Иногда значение json находится в полном элементе, я не знаю почему. –

+0

Это не часть вашего вопроса. Вы должны задать новый вопрос, почему Redis возвращает строку вместо кортежа. – Daniel

+0

Да, вы правы, и ваш ответ правильный для моего вопроса здесь, поэтому я принял его и поддержал синицу. –

Смежные вопросы