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
/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"])
原来MacOS上的ujson版本是1.35,而Linux上的是2.0.1。
该模块因某种原因被更改,版本 2.0.1 不再支持该类型的序列化。
但是,如果我写:
ujson.dumps(plist_as_file.readlines())
有效。因为我只需要它作为唯一标识符,所以我可以用它来代替。
我已将我在 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
/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"])
原来MacOS上的ujson版本是1.35,而Linux上的是2.0.1。 该模块因某种原因被更改,版本 2.0.1 不再支持该类型的序列化。
但是,如果我写:
ujson.dumps(plist_as_file.readlines())
有效。因为我只需要它作为唯一标识符,所以我可以用它来代替。