2015-04-28 4 views
4

Не могу понять, почему следующий тип изменяется на unicode от str.Почему json.loads возвращает объект unicode вместо строки

case1

Python 2.7 (r27:82500, Nov 19 2014, 18:07:42) 
[GCC 4.5.1 20100924 (Red Hat 4.5.1-4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import json 
>>> x = {'resources': {}, 'tags': ['a', 'b']} 
>>> ret = json.dumps(x) 
>>> ret 
'{"resources": {}, "tags": ["a", "b"]}' 
>>> 
>>> type(ret) 
<type 'str'> 
>>> ret2 = json.loads(ret) 
>>> ret2 
{'resources': {}, 'tags': ['a', 'b']} 

Вариант 2

Python 2.7.5 (default, Apr 22 2015, 21:27:15) 
[GCC 4.9.2 20141101 (Red Hat 4.9.2-1)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import json 
>>> x = {'resources': {}, 'tags': ['a', 'b']} 
>>> ret = json.dumps(x) 
>>> ret 
'{"resources": {}, "tags": ["a", "b"]}' 
>>> type(x) 
<type 'dict'> 
>>> type(ret) 
<type 'str'> 
>>> ret2 = json.loads(ret) 
>>> ret2 
{u'resources': {}, u'tags': [u'a', u'b']} 
>>> 

Таким образом, в случае 2 мы видим Юникода объекты, где, как и в случае 1, мы видим строку вместо. Я не вижу никаких изменений кода в двух версиях python, которые могут привести к этому. Может быть, я что-то пропустил. Любые провода будут оценены. Thanks

ответ

6

Версия 2.7 Python имела ошибку, которая вызвала поведение в вашем первом примере. Это было зафиксировано в 2.7.5. См. issue 10038. Обратите внимание, что версия 2.6.6 ведет себя как 2.7.5, указывая, что поведение 2.7 было изменением от ранее установленного поведения.

Я не думаю, что в двух версиях python произошел сбой кода, что может привести к этому.

Не нужно «думать», ничего не изменилось, когда вы можете проверить и быть уверенным! Каждый выпуск Python содержит подробные заметки, указывающие, что именно изменилось. Термин «json» появляется двадцать восемь раз в Python 2.7.5 change log. Разумеется, изменения также могли быть внесены в JSON в Python 2.7.1, 2.7.2, 2.7.3 и 2.7.4.

+0

На самом деле, я имел в виду, я не вижу никаких изменений кода relvant в определении функции json.loads(). Может быть, я что-то пропустил. – user3872776

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