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

Porting json.dump into StringIO code to python 3

我正在将 Python 2 应用程序移植到 Python 3。目前 运行 宁 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 argument expected, got 'str'"(这是 运行ning 在 Python 2 下 - 可以这么说,我仍在准备地面,并且不打算使用Python 3 直到我在 Python 下完成尽可能多的准备和测试 2.)

通过一些实验,我尝试使用 io 中的 BytesIO,但这会产生不同的错误 "TypeError: 'unicode' does not have the buffer interface"。

显然,json.dump 的 Python2 版本正在将 str 值写入提供的文件对象。我 认为 json.dump 的 Python3 版本也写入 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 的情况。这是使用 StringIOjson.dump 的特殊情况,这给我带来了一些问题。

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

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

你的其余代码应该可以正常工作,至少你问题中提供的代码对我来说工作得很好。

使用six's StringIO

from six.moves import StringIO