我将我在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或Ubuntu上均不能使用,因为Apple的macOS和iOS .plist文件是not 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。
与dump
(或dumps
)模块具有相同的load
/ loads
和json
/ ujson
方法。
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"])
事实证明,在MacOS上,ujson版本为1.35,而在Linux上,版本为2.0.1。出于任何原因更改了模块,版本2.0.1不再支持该类型的序列化。
但是,如果我写:
ujson.dumps(plist_as_file.readlines())
有效。因为我只需要它作为唯一标识符,所以我可以改用它。