【发布时间】:2019-10-16 12:46:10
【问题描述】:
这很烦人,我只需要运行此代码一次。之后,所有内容都将被删除(这是迁移代码)
我有一个 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 对象。
我知道这真的很糟糕,我很抱歉。
【问题讨论】:
-
反序列化为
dynamic,你可以随意访问。这对于生产代码来说不是很健壮,但对于一次性使用来说还不错。 -
为什么你根本不声明财产 public int Id { get;放; } 作为公共字符串 ID { 获取;放; }
-
我会反序列化为
JObject(如果使用 Newtonsoft 的包)而不是dynamic,然后检查它是否具有所需的数据。