Каков наилучший способ обработки класса/JSON/десерилизации при изменении способа сериализации данных в C#

#c# #json #json-deserialization

#c# #json #json-десериализация

Вопрос:

Приведенные ниже данные/примеры являются частью гораздо большего объема сохраняемых данных JSON, в которые я включил только ту часть, которая меняется.

Допустим, в настоящее время у меня есть свойство, и оно сериализуется в хранилище в следующем формате:

Собственность

 public Listlt;stringgt; OrgHierarchy { get; set; } = new Listlt;stringgt;();  

JSON

 {  "OrgHierarchy": [  "Corporate",  "Region",  "District",  "Store"  ] }  

Теперь нам нужно внести некоторые изменения в это следующим образом

Собственность

 public Listlt;OrgHierarchyItemgt; OrgHierarchy { get; set; } = new Listlt;OrgHierarchyItemgt;();  

Класс

 public class OrgHierarchyItem {  public string Key { get; set; }  public string Value { get; set; } }  

JSON

 {  "OrgHierarchy": [  {  "Key": "Corporate",  "Value": "My Company"  },  {  "Key": "Region",  "Value": "My Region"  },  {  "Key": "District",  "Value": "My District"  },  {  "Key": "Store",  "Value": "My Store"  }  ] }  

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

Я мог бы динамически читать в JSON и проверять изменяющийся JSON и обрабатывать его таким образом, я мог бы попробовать/перехватить десериализацию в случае, если это старый формат и его нельзя десериализовать.

Я просто ищу лучший способ справиться с этой ситуацией, так как уверен, что другим приходилось сталкиваться с чем-то подобным.

Комментарии:

1. Ну, я бы предпочел обновить все данные, тогда сериализация не будет проблемой. Если вы настаиваете на сериализации. Вы можете проанализировать его JsonDocument и получить OrgHierarchy свойство, проверить ValueKind , является ли оно ValueKind.Object , а затем сериализовать его в Listlt;OrgHierarchyItemgt; другое, получить значение в виде строки.

2. Может быть полезно добавить version поле в данные JSON и использовать значение (или отсутствие значения) для выбора правильных типов десериализации?