Это довольно раздражает, и мне нужно только запустить этот код ОДИН РАЗ. После этого все будут удалены (это код миграции)
У меня есть List<string>
строк JSON. Они содержат различные форматы объектов JSON, которые могут выглядеть следующим образом:
{
"id": 123
}
{
"id": "7521b497-abb7-46b8-bddc-177a6fd9f974",
"folderId": 123
}
{
"folderId": 123
}
и так далее. Мне нужно получить 123
, который может быть в свойствах id
и folderId
. Если я просто сделаю:
class IdModel {
public int Id { get; set; }
}
//inside a function
var model = JsonConvert.DeserializeObject<IdModel>(json);
, то произойдет сбой при переходе ко второму JSON, потому что id
- это GUID. Вместо этого нужно искать FolderId
, что означает, что я могу сделать что-то вроде этого:
class IdModel {
public int Id { get; set; }
}
class FolderIdModel {
public int FolderId { get; set; }
}
//inside a function
int folderId;
try {
var model = JsonConvert.DeserializeObject<FolderIdModel>(json);
folderId = model.FolderId;
} catch {
var model = JsonConvert.DeserializeObject<IdModel>(json);
folderId = model.Id;
}
Это было бы "хорошо" для этого сценария, но у меня, вероятно, есть 10 различных объектов JSON, чтовсе выглядят по-другому. FolderId > Id
, потому что я всегда знаю, что FolderId правильный, если только у него нет FolderId, в этом случае он МОЖЕТ иметь Id (должен взорваться, если ни FolderId, ни Id не верны).
Мой вопрос:Есть ли умный способ десериализации для разных моделей, не глядя на JSON? Помните, что Id
может быть как GUID, так и целым числом, в зависимости от объектов JSON.
Я знаю, что это действительно плохо, и мне жаль.