【问题标题】:Unable to parse into JSON object in Python无法在 Python 中解析为 JSON 对象
【发布时间】:2013-05-31 18:15:15
【问题描述】:

我到处搜索,但之前没有人说这个错误。

obj 将返回一个 unicode 对象,但它会返回以下错误

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

如果我对响应的结果进行硬编码,它就可以工作。
客户帐户.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”:真,“is_superuser”:真,“is_staff”:真,“last_login”:“2013-05-29T08:08:43.859Z”,“组”:[],“user_permissions”:[],“密码": "pbkdf2_sha256$10000$1HdCOPgsoXvx$8jjOpTFVcVAtUshpjJDPEGs/TRq7jeJ2T/2i55FIPeM=", "email": "admin@admin.com", "date_joined": "2013-05-15T07:59:30Z"}}]

【问题讨论】:

  • 你在查字典,不应该是print obj[0]['pk']吗?

标签: python json parsing unicode


【解决方案1】:

你的类型错了:

  • objlist
  • obj[0]dict
  • dict 没有pk 属性,但是您可以使用obj[0]['pk'] 检索键"pk" 的值

【讨论】:

  • 试过 print obj[0]['pk'] 我有这个错误 异常类型:TypeError 异常值:字符串索引必须是整数
  • 试过 obj[0].get('pk') 这是以下错误异常类型:AttributeError 异常值:'unicode'对象没有属性'get'
  • 当我打印 obj[0] 时,似乎 obj 是一个字符串列表,它会给我字符串的第一个字符。
  • 这不是python的正确(但如果是javascript则有效)json对象。顺便提一句。您正在混合使用 javascript 数据类型,true 未加引号。 Python 会对此大加赞赏。
  • 尝试将 true 更改为 True 但没有什么不同。它仍然是 unicode 对象。
【解决方案2】:

你说你得到

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

在检索 obj[0].pk 时。如果是数据类型错误,您会得到'dict' object has no attribute 'pk'

所以问题是您的obj[0] 不是您所期望的dictlist,而是一个unicode 字符串

根据 cmets,会发生以下情况:

  1. 您在服务器端生成 JSON 对象。
  2. 对其进行 JSON 编码。您现在有一个 unicode 字符串
  3. JSON 编码 再次。现在你有了一个 unicode 字符串作为 JSON 对象。

  4. 从 URL 中检索。

  5. 解码一次。您现在有了对对象进行编码的 unicode 字符串
  6. 从 unicode 字符串中提取 pk... 你不能这样做。

快速解决方法是对对象进行两次解码。真正的解决方法是检测双重编码发生的位置并防止这种情况发生。

应该告诉我发生的事情是这样的:

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

如果那是一个 Python 对象(而不是 JSON 编码),它会是:

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

【讨论】:

  • 硬编码可以工作,但如果我从 url 检索它就不起作用。
  • 是的,我在重新阅读您的问题时看到它并更新了答案。
  • 这是 URL 的输出 return "[{\"pk\": 1, \"model\": \"auth.user\", \"fields\": {\"用户名\":\"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\": [], \"密码\": \"pbkdf2_sha256$10000$1HdCOPgsoXvx$8jjOpTFVcVAtUshpjJDPEGs/TRq7jeJ2T/2i55FIPeM=\", \"email\": \"admin@admin.com\", \"date_joined\": \"2013-05-15T07:59 :30Z\"}}]"
  • 它是一个用户对象并且被 JSON.dumps 到一个 http 响应中。
  • 我如何转储它:返回 HttpResponse(json.dumps(result), content_type="application/json")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多