U json работает на MacOS, но не работает на Ubuntu - PullRequest
0 голосов
/ 14 марта 2020

Я клонировал проект Python, над которым я работал, на MacOS, на новую (виртуальную) машину Ubuntu.

Мне удалось запустить его, но программа вылетает при следующем строка:

ujson.dumps(plist_as_file) # crash

Ошибка:

TypeError: � is not JSON serializable

Я понятия не имею, какой это символ и где он находится. plist_as_file - это файл ma c * .plist, открытый следующей строкой:

with open(plist_path, 'rb') as plist_as_file:

Возможно, git что-то испортило, но поскольку MacOS и Ubuntu Unix на основании, я не очень понимаю, как.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Оказывается, версия u json на MacOS была 1.35, а версия на Linux - 2.0.1. Модуль был изменен по любой причине, и версия 2.0.1 больше не поддерживает сериализацию этого типа.

Однако, если я напишу:

ujson.dumps(plist_as_file.readlines())

, это работает. Поскольку мне нужен только уникальный идентификатор, я могу использовать его вместо этого.

0 голосов
/ 21 марта 2020

Я не думаю, что код будет работать как на MacOS, так и на Ubuntu, потому что файлы Apple MacOS и iOS .plist не JSON. Они следуют больше за форматом XML, и они даже говорят это в документах :

Сам файл обычно кодируется с использованием кодировки Unicode UTF-8 и содержимого структурированы с использованием XML.

Выполнение вашего кода на Ma c или в 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"])
...