2013-06-05 2 views
0

У меня есть поиск по всем параметрам, но никто раньше не сообщал об этой ошибке.Невозможно разобрать на объект JSON в Python

Объект сос возвращает объект Юникода, но он возвращает следующую ошибку

Exception Type: AttributeError 
Exception Value:'unicode' object has no attribute 'pk' 

Это работает, если я жесткий код результата от ответа.
CustomerAccount.py

from django.contrib.auth.models import User 

регистрация Войти

return user 

api.py

result = CustomerAccount.login(username, password) 
return HttpResponse(json.dumps(result), content_type="application/json") 

views.py

import urllib2 
import json 

res = urllib2.urlopen("http://127.0.0.1:8000/api/login?username=admin&password=admin").read() 
obj = json.loads(res) 
print obj[0].pk 

Результат печати OBJ:

[{"pk": 1, "model": "auth.user", "fields": {"username": "admin", "first_name": "Admin", "last_name": "admin", "is_active": true, "is_superuser": true, "is_staff": true, "last_login": "2013-05-29T08:08:43.859Z", "groups": [], "user_permissions": [], "password": "pbkdf2_sha256$10000$1HdCOPgsoXvx$8jjOpTFVcVAtUshpjJDPEGs/TRq7jeJ2T/2i55FIPeM=", "email": "[email protected]", "date_joined": "2013-05-15T07:59:30Z"}}]

+0

Вы ищете словарь, не должен ли он быть 'print obj [0] ['pk']'? –

ответ

3

Вы получили ваши типы неправильно:

  • obj является list
  • obj[0] является dict
  • dict не имеет pk атрибут, однако вы можете получить значение для ключа "pk" с: obj[0]['pk']
+0

Tried print obj [0] ['pk'] и у меня есть эта ошибка Тип исключения: \t ТипError Значение исключения: строковые индексы должны быть целыми числами – user2447506

+0

try 'obj [0] .get ('pk')'. –

+0

Я попытался выполнить печать obj [0], распечатал следующее: [ – user2447506

2

Вы говорите, что вы получите

Exception Value:'unicode' object has no attribute 'pk' 

при получении obj[0].pk. Если это была ошибка типа данных, вместо этого вы получили бы 'dict' object has no attribute 'pk'.

Таким образом, проблема в том, что ваш obj[0] не dict, как вы ожидаете, или list, но это юникода строка.

Согласно комментариям, это то, что происходит:

  1. Вы генерируете на стороне сервера объект JSON.
  2. JSON-encode it. Теперь у вас есть строка unicode.
  3. JSON-encode it . Теперь у вас строка unicode как объект JSON.

  4. Извлеките его из URL-адреса.

  5. Декодировать раз. Теперь у вас есть строка unicode, которая кодирует объект.
  6. Извлечение pk из строки unicode ... и вы не можете этого сделать.

Быстрое исправление заключается в том, чтобы дважды декодировать объект. Реальное исправление обнаруживает, где происходит двойное кодирование и предотвращает это.

предательский, что должен сказал мне то, что случилось это:

[{"pk": 1, "model": ... 

Если это был Python объект (вместо кодировки JSON), это было бы:

[{u'pk': 1, u'model': ... 
+0

Hardcoding работает, но если я его извлечу из URL-адреса, это не сработает. – user2447506

+0

Да, я видел это, перечитывая ваш вопрос и обновляя ответ. – LSerni

+0

Это результат возврата URL-адреса «[{\" pk \ ": 1, \" model \ ": \" auth.user \ ", \" fields \ ": {\" username \ ": \" admin \ ", \" first_name \ ": \" Admin \ ", \" last_name \ ": \" admin \ ", \" is_active \ ": true, \" is_superuser \ ": true, \" is_staff \ ": true, \ "last_login \": \ "2013-05-29T08: 08: 43.859Z \", \ "groups \": [], \ "user_permissions \": [], \ "password \": \ "pbkdf2_sha256 $ 10000 $ 1HdCOPgsoXvx $ 8jjOpTFVcVAtUshpjJDPEGs/TRq7jeJ2T/2i55FIPeM = \ ", \" email \ ": \" [email protected] \ ", \" date_joined \ ": \" 2013-05-15T07: 59: 30Z \ "}} ] " – user2447506

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