Ujson在MacOS上有效,但在Ubuntu上无效

问题描述 投票:0回答:2

我将我在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,所以我真的不知道如何。

有什么想法吗?

python plist ujson
2个回答
0
投票

我不认为代码在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 / loadsjson / 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"])

0
投票

事实证明,在MacOS上,ujson版本为1.35,而在Linux上,版本为2.0.1。出于任何原因更改了模块,版本2.0.1不再支持该类型的序列化。

但是,如果我写:

ujson.dumps(plist_as_file.readlines())

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

© www.soinside.com 2019 - 2024. All rights reserved.