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
/dumps
和load
/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