将json.dump移植到StringIO代码到python 3

时间:2018-08-23 08:10:17

标签: python json python-3.x python-2.7 stringio

我正在将Python 2应用程序移植到Python3。当前正在运行Python2.7,但是在更新代码以通过pylint --py3k测试时,我遇到了一个问题:

def json_resource_file(baseurl, jsondata, resource_info):
    """
    Return a file object that reads out a JSON version of the supplied entity values data. 
    """
    response_file = StringIO()
    json.dump(jsondata, response_file, indent=2, separators=(',', ': '), sort_keys=True)
    response_file.seek(0)
    return response_file

它在以下情况下可以正常工作

from StringIO import StringIO

但是StringIO.StringIO在Python3中不存在(根据pylint),因此使用:

from io import StringIO

我得到一个错误:“ TypeError:预期使用unicode参数,得到了'str'”(这是在Python 2下运行的-可以这么说,我仍在准备工作,并且不打算使用Python 3,直到我在Python 2下已经做了尽可能多的准备和测试。)

通过一些实验,我尝试使用BytesIO中的io,但这会产生不同的错误“ TypeError:'unicode'没有缓冲区接口”。

很显然,Python2版本的json.dump正在将str值写入提供的文件对象。我认为 Python3版本的json.dump还写了str(即Unicode)值。

所以我的问题是:是否有一种简单的方法可以将JSON转储到与Python 2和3兼容的StringIO内存缓冲区?

注释

  1. 我意识到我可以使用json.dumps并将结果强制为StringIO所期望的任何类型,但这一切似乎都很笨拙。

  2. 在迁移过程中,我还将使用以下将来的导入内容:

    from __future__ import (unicode_literals, absolute_import, division, print_function)
    
  3. 目前,我正在考虑的解决方案是测试python版本并相应地导入StringIO的其他版本,但这会违反"Use feature detection instead of version detection"原则。

  4. 在我的大多数代码中,对于我使用from io import StringIO的情况,使用StringIO似乎可以正常工作。在StringIO中使用json.dump的特定情况引起了我一些问题。

2 个答案:

答案 0 :(得分:0)

如果您的问题是import语句,只需将其包装在try语句中即可:

try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO

您其余的代码应按原样工作,至少您问题中提供的代码对我来说是正常的。

答案 1 :(得分:0)

使用six's StringIO

from six.moves import StringIO