Ujson 适用于 MacOS,但不适用于 Ubuntu

Posted

技术标签:

【中文标题】Ujson 适用于 MacOS,但不适用于 Ubuntu【英文标题】:Ujson works on MacOS, but doesn't work on 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 之类的东西。 【参考方案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。我得重新考虑一下。

以上是关于Ujson 适用于 MacOS,但不适用于 Ubuntu的主要内容,如果未能解决你的问题,请参考以下文章

装饰器适用于函数但不适用于类

AutoLayout 适用于 UIView 但不适用于 UILabel。为啥?

重定向适用于登录但不适用于注销

Jquery $.Post 适用于 Firefox 但不适用于 Chrome

为啥 jQuery 选择器适用于 Chrome,但不适用于 Safari?

Tkinter 画布图像适用于 Windows 但不适用于 OSX