#python #json
#python #json
Вопрос:
У меня есть скрипт на python, который должен сгенерировать файл json в определенной структуре.
Итак, чтобы достичь этого, мой план состоял в том, чтобы создать мои классы данных сущностей, которые представляют структуру этого файла json, сконструировать их, проделать всю магию, необходимую для генерации, и сбросить мой объект в файл json с json.dumps(my_object)
.
Теперь моя проблема в том, что в этой структуре json есть такие поля, как weird-field:
. поскольку я не могу использовать символ «тире» в моем классе данных из-за синтаксиса python, я не могу создать свой класс entity, который представляет мою структуру json. (Этот файл json будет использоваться другой системой, поэтому у меня нет возможности изменить структуру.)
Прямо сейчас я работал над этим, используя неправильные имена полей, такие weird_field
как, которые принимаются python, затем после кодирования их в json я вручную заменил эти неправильные имена полей в строке json.
Интересно, есть ли лучший способ сделать это. В java вы можете просто использовать специальную аннотацию к этим полям в вашем классе, чтобы сказать «Эй, Джексон, используй эту строку для кодирования вместо имени поля класса». Каков способ python сделать то же самое?
В коде то, что я хотел бы сделать, это:
@dataclass
class MyClass:
weird-field: int = 0 # syntax error here
json_obj = MyClass()
json_obj.weird-field = 621
print(json.dumps(json_obj))
Я хотел бы получить
{
weird-field: 621
}
Но это приводит к сбою, поскольку ‘-‘ не может использоваться для имени поля в python.
Комментарии:
1. Создайте свою собственную функцию синтаксического анализа и самостоятельно напишите желаемый результат в формате JSON
2. Это кажется большой работой. Мой json намного больше, чем этот пример, с большим количеством подклассов. Я бы предпочел использовать какое-нибудь более простое решение.
Ответ №1:
Используйте словари.
json_obj = dict()
json_obj['weird-field'] = 621
my_weird_value = json_obj['weird-field'] # returns 621
print(json.dumps(json_obj))
Комментарии:
1. Это может сработать, однако мне не нравится тот факт, что я не могу использовать предопределенные классы. Например, в структуре json есть список подклассов, и каждый раз, когда я хочу добавить этот список, мне нужно создать новый словарь и создать каждый ключ вручную, что дает мне много шансов допустить опечатки. Но я думаю, я могу просто сохранить свои классы, создать функцию, которая сама создает словарь с правильными ключами, и работать с этим. Итак, спасибо, я могу с этим работать.