2014-12-18 2 views
-2

Я получаю эту строку от stdin.Python: Индексы строк должны быть целыми числами

{u'trades': [Custom(time=1418854520, sn=47998, timestamp=1418854517, price=322, amount=0.269664, tid=48106793, type=u'ask', start=1418847319, end=1418847320), Custom(time=1418854520, sn=47997, timestamp=1418854517, price=322, amount=0.1, tid=48106794, type=u'ask', start=1418847319, end=1418847320), Custom(time=1418854520, sn=47996, timestamp=1418854517, price=321.596, amount=0.011, tid=48106795, type=u'ask', start=1418847319, end=1418847320)]}

Моя программа терпит неудачу, когда я пытаюсь получить доступ к jsonload["trades"]. Если я использую jsonload[0], я получаю только один символ: {.

Я проверил, что это не проблема, потому что получить текст от stdin, но я не знаю, является ли это проблемой получения формата (потому что я использовал библиотеку Incursion), или если это проблема в моем коде на Python , Я пробовал много комбинаций около json.load/s и json.dump/s, но безуспешно.

inputdata = sys.stdin.read() 

jsondump = json.dumps(inputdata) 

jsonload = json.loads(jsondump) 

print jsonload 
print type(jsonload) # return me "<type 'unicode'>" 
print repr(jsonload) # return me same but with u" ..same string.... " 
for row in jsonload["trades"]: # error here: TypeError: string indices must be integers 
+2

Ваш 'jsonload' является' string', а не 'dict'. –

+0

Попробуйте 'jsonload = json.loads (inputdata)'. – jonrsharpe

+0

@jonrsharpe it return me different error "ValueError: Ожидание имени свойства: строка 1 столбец 2 (char 1)", но вместо этого запускается json.loads –

ответ

1

Вы считываете входные данные в строку. Затем он преобразуется в кодированную строку JSON на json.dumps. Затем вы возвращаете его обратно в обычную строку, используя json.loads. Вы не интерпретировали исходные данные как JSON в любой момент.

Постарайся просто преобразование входных данных из JSON:

inputdata = sys.stdin.read() 
jsonload = json.loads(inputdata) 

Однако это не будет работать, потому что вы не получили достоверные данные в формате JSON в вашем фрагменте кода. Это похоже на сериализованный код python. Вы можете проверить входные данные с помощью http://jsonlint.com

Использование u'trades' показывает, что у вас есть строка кода юникода. Эквивалент JSON будет "trades". Чтобы преобразовать код python, вы можете указать eval, но это опасная операция, если данные поступают из ненадежного источника.

+0

Да, тип печати (jsonload) # return me" ". Я прочитал сейчас об eval, но это надежная среда, потому что я сгенерировал вывод из другого скрипта, но я предпочитаю не использовать его. Но я не могу понять, почему библиотека Incursion работает, но не для меня, поэтому я забываю что-то делать в середине. –

+0

В вашем исходном коде, который на самом деле просто указывает, что ваши строки являются unicode. Вы не проанализировали свою строку, чтобы на самом деле ничего не рассказывали. –

+0

Тогда я не знаю, как разбирать юникод, правда? –

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