преобразовать строку json в объект python - PullRequest
42 голосов
/ 03 октября 2010

Можно ли преобразовать строку json (например, ту, что возвращена из службы json поиска в твиттере) в простые строковые объекты.Вот небольшое представление данных, возвращаемых службой json:

{
results:[...],
"max_id":1346534,
"since_id":0,
"refresh_url":"?since_id=26202877001&q=twitter",
.
.
.
}

Допустим, я каким-то образом сохраняю результат в некоторой переменной, скажем, obj .Я ищу, чтобы получить соответствующие значения, как показано ниже:

print obj.max_id
print obj.since_id

Я пытался использовать simplejson.load() и json.load(), но он дал мне сообщение об ошибке 'str' object has no attribute 'read'

Ответы [ 3 ]

77 голосов
/ 03 октября 2010

Я пытался использовать simplejson.load() и json.load(), но он выдал ошибку, говорящую 'str' object has no attribute 'read'

Чтобы загрузить из строки, используйте json.loads() (обратите внимание на 's').

Более эффективно, пропустите шаг чтения ответа в строку и просто передайте ответ на json.load().

0 голосов
/ 16 сентября 2017
magicJsonData=json.loads(io.StringIO((youMagicData).decode("utf-8"))
print(magicJsonData)

Строка json из любого запроса или http-сервера имеет тип байтового массива для преобразования их в строку (поскольку речь идет о байтовом массиве, возвращаемом из запроса к серверу, верно?)

res = json.loads((response.content).decode("utf-8") )
print(res)

здесь response.content может быть байтовым массивом или любой возвращаемой строкой из запроса сервера, которая декодируется в формат строки (utf-8) и возвращается как массив python.

Или просто используйте bytearray, но используйтевместо json.load json.loads

0 голосов
/ 20 июля 2016

, если вы не знаете, будут ли данные файлом или строкой .... используйте

import StringIO as io
youMagicData={
results:[...],
"max_id":1346534,
"since_id":0,
"refresh_url":"?since_id=26202877001&q=twitter",
.
.
.
}

magicJsonData=json.loads(io.StringIO(str(youMagicData)))#this is where you need to fix
print magicJsonData
#viewing fron the center out...
#youMagicData{}>str()>fileObject>json.loads
#json.loads(io.StringIO(str(youMagicData))) works really fast in my program and it would work here so stop wasting both our reputation here and stop down voting because you have to read this twice 

от https://docs.python.org/3/library/io.html#text-i-o

json.loads из встроенных библиотек python, json.loads требует файловый объект и не проверяет, что он передан, поэтому он все еще вызывает функцию чтения того, что вы передали, потому что файловый объект отдает данные только при вызове читать(). Так как встроенный строковый класс не имеет функции чтения, нам нужна оболочка. Итак, функция StringIO.StringIO, короче говоря, подклассы класса строки и класса файла и связывание внутренней работы слышат мою низкую детализацию перестроения https://gist.github.com/fenderrex/843d25ff5b0970d7e90e6c1d7e4a06b1 так что, в конце концов, все равно, что написать файл оперативной памяти и поместить его в одну строку ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...