Использование пользовательских имен полей для кодирования json в python

#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 есть список подклассов, и каждый раз, когда я хочу добавить этот список, мне нужно создать новый словарь и создать каждый ключ вручную, что дает мне много шансов допустить опечатки. Но я думаю, я могу просто сохранить свои классы, создать функцию, которая сама создает словарь с правильными ключами, и работать с этим. Итак, спасибо, я могу с этим работать.