【问题标题】:Troubles with JSON data and Unicode on django-rest-frameworkdjango-rest-framework 上的 JSON 数据和 Unicode 问题
【发布时间】:2014-09-14 00:02:24
【问题描述】:

我使用 djangorestframework=2.3.14 和客户端使用 python requests=2.3.0 和 nap=1.0.1 创建了一个 REST API。客户端使用类似的方式将 JSON 数据发送到 API:

response = self.environment_detail_url.patch(data=json.dumps({'egg_list': finder.get_eggs_dict()}), headers={'content-type': 'application/json'})

在 REST API 视图中,我使用这个序列化器:

class EnvironmentSerializer(serializers.ModelSerializer):
    egg_list = serializers.CharField(
        widget=widgets.Textarea,
        write_only=True,
        required=True,
    )

    class Meta:
        model = WebsiteEnvironment
        fields = ('id', 'created', 'modified', 'name', 'url', 'egg_list')

我添加了一个方法“validate_egg_list”来验证发送的数据以执行一些工作。但是当我尝试加载 JSON 数据时,我收到了来自 json 的错误,例如:

ValueError: Expecting property name: line 1 column 1 (char 1)

确实 JSON 数据看起来像这样:

{
    u'six': {
        u'url': u'http://pypi.python.org/pypi/six/',
        u'version': u'1.5.2'
    },
    u'pytz': {
        u'url': u'http://pythonhosted.org/pytz',
        u'version': u'2014.4'
    }
}

所有字符串都以 unicode 符号 u'' 为前缀。

我在我的 API 和客户端中到处搜索,以查找我做错了什么,但我没有找到任何可能导致这种情况的地方。

有人知道吗?

谢谢。

【问题讨论】:

标签: json python-requests django-rest-framework


【解决方案1】:

查看您在GitHub 上链接到的代码,您在编辑中用于打印数据的是

attrs[source]

鉴于 attrs 是 Django REST Framework 提供的字典,而 source 是您用来验证 egg_list 值的键,我无法理解为什么 Django REST Framework 会传入表示解析的字典。这似乎至少是一个错误。似乎 Django REST Framework 正在对您应该验证的数据做出假设,例如,简单的数据类型,而不是字典。如果它在attrs 中的所有值上调用str(),那么这就解释了为什么你会收到repr

【讨论】:

  • 这也是我的想法,但我不确定这是否真的是一个错误,或者我是否对客户端或 api 做错了什么。我将在 Django REST Framework 上填写一个错误问题来验证这一点。
【解决方案2】:

这不是 JSON。那是一个 Python repr。您不能在 Python repr 上使用 JSON 解析器,这不是一回事。

【讨论】:

  • 好吧,如果它真的是一个嵌入在由 rest-framework 接收的 unicode 字符串中的 python repr,我不知道它是怎么发生的,因为就像你在我的代码示例中看到的那样,我真的发送一个 JSON
  • 我不知道你的 patch() 方法是做什么的,但那不是 JSON。
  • patch() 方法来自 nap,它只是 python-requests 的一个小包装
  • 它仍然没有返回 JSON。
猜你喜欢
  • 2021-06-17
  • 2014-12-05
  • 2021-08-03
  • 2015-09-15
  • 1970-01-01
  • 2019-04-01
  • 2020-08-10
  • 2013-02-01
  • 2020-11-15
相关资源
最近更新 更多