【问题标题】:Ujson works on MacOS, but doesn't work on UbuntuUjson 适用于 MacOS,但不适用于 Ubuntu
【发布时间】:2020-06-26 00:06:56
【问题描述】:

我已将我在 MacOS 上处理的 Python 项目克隆到新的 Ubuntu(虚拟)机器上。

我设法让它运行,但程序在以下行崩溃:

ujson.dumps(plist_as_file) # crash

错误是:

TypeError: � is not JSON serializable

我不知道那是哪个角色,也不知道它是在哪里找到的。 plist_as_file 是一个 mac *.plist 文件,用这一行打开:

with open(plist_path, 'rb') as plist_as_file:

可能是 git 搞砸了,但由于 MacOS 和 Ubuntu 都是基于 Unix 的,我真的不知道怎么做。

有什么想法吗?

【问题讨论】:

  • 在 MacOS 上运行是什么意思?您的意思是它可以将 .plist 文件作为 JSON 读取?这里的问题是 plist 文件类似于 XML 而不是 JSON,因此 ujson 不是这里合适的工具。我怀疑您所拥有的是实际的 plist 格式。我认为最好使用 Python 内置的 plistlib 之类的东西。

标签: python plist ujson


【解决方案1】:

原来 MacOS 上的 ujson 版本是 1.35,而 Linux 上的版本是 2.0.1。 模块因某种原因被更改,2.0.1 版不再支持该类型的序列化。

但是,如果我写:

ujson.dumps(plist_as_file.readlines())

它有效。由于我只需要它作为唯一标识符,因此我可以使用它。

【讨论】:

    【解决方案2】:

    我认为该代码不能同时在 MacOS 或 Ubuntu 上运行,因为 Apple 的 macOS 和 iOS .plist 文件是不是 JSON。他们更多地遵循 XML 格式,甚至在docs 中这样说:

    文件本身通常使用 Unicode UTF-8 编码进行编码,内容使用 XML 进行结构化。

    在 Mac 或 Ubuntu 上运行您的代码:

    import ujson
    
    with open("Info.plist", 'r') as plist_as_file:
        ujson.dumps(plist_as_file)
    

    将导致:

    Traceback (most recent call last):
      File "test.py", line 4, in <module>
        ujson.dumps(plist_as_file)
    TypeError: <_io.BufferedReader name='Info.plist'> is not JSON serializable
    

    如果由于某种原因,您可以成功打开 .plist 并且没有收到该错误,那么您所拥有的 不是一个实际的 .plist 文件。无论文件open模式是r还是rb,错误都是一样的。

    你说你得到了:

    TypeError: � is not JSON serializable
    

    我认为这是同样的错误,但由于某种原因,它没有正确打印出来。所以,ujson 确实不是在这里使用合适的工具,用 Git 也不是问题。

    Python 提供了一个用于读取/写入 .plist 文件的内置模块:plistlib

    它与json(或ujson)模块具有相同的dump/dumpsload/loads方法。

    import plistlib
    
    with open("Info.plist", 'rb') as plist_as_file:
        plist_data = plistlib.load(plist_as_file)
    
    # The entire contents is stored as a dict
    print(plist_data)
    
    # Access specific content as a dict
    print(plist_data["CFBundleShortVersionString"])
    print(plist_data["UIMainStoryboardFile"])
    

    【讨论】:

    • 你完全没有抓住重点,但这不是你的错,我在解释中遗漏了一些细节。 Plistlib 比 ujson 慢得多。我使用 ujson 快速读取文件并使用 xxhash 生成唯一标识符。然后它被进一步用于缓存 plistlib 加载操作的结果。
    • 现在我已经大声写出来了,我不知道为什么我什至使用 ujson,我可以将原始字符串列表提供给 xxhash。我得重新考虑一下。
    猜你喜欢
    • 2019-12-05
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    相关资源
    最近更新 更多