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

Ujson works on MacOS, but doesn't work on Ubuntu

我已将我在 MacOS 上工作的 Python 项目克隆到新的 Ubuntu(虚拟)machine。

我已经设法达到 运行,但程序在以下行崩溃:

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文件 而不是 JSON。他们更多地遵循 XML 格式,他们甚至在 docs:

中这样说

The file itself is typically encoded using the Unicode UTF-8 encoding and the contents are structured using 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 为 reading/writing .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"])

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

但是,如果我写:

ujson.dumps(plist_as_file.readlines())

有效。因为我只需要它作为唯一标识符,所以我可以用它来代替。