我正在构建一个.NET WebAPI,它通过Post操作接收Json。收到的Json可能如下所示:
{
"site": "00131231201d010231",
"publishTime": 123123123123,
"domains": [
"example.com"
],
"publishedBy": {
"name": "John Doe",
"id": "00211231201d010231"
}
}
我将Json响应类型转换为C#对象,如下所示:
public class Project
{
[Key]
[JsonPropertyName("site")]
public string Site { get; set; }
[JsonPropertyName("publishTime")]
public long PublishTime { get; set; }
[JsonPropertyName("domains")]
public List<Domain> Domains { get; set; }
[JsonPropertyName("publishedBy")]
public PublishedBy PublishedBy { get; set; }
}
public class PublishedBy
{
[JsonPropertyName("name")]
public string Name { get; set; }
[Key]
[JsonPropertyName("id")]
public string Id { get; set; }
}
public class Domain
{
[Key]
public string Id { get; set; }
public string Name { get; set; }
}
正如您所看到的,我的目标是将内容添加到我的数据库中。只有当我使用List Domains时,它才会给我一个错误,说当我尝试添加迁移时,我不能在EFCore中使用字符串。
所以,我创建了一个名为Domain的对象。但现在,当我尝试反序列化时,它会给我以下错误:
System.Text.Json.JsonException: The JSON value could not be converted to spine_management.Models.Domain.
有人知道我应该把Domains作为什么类型吗?和/或反序列化这个对象的最佳方法是什么?
编辑:
我想保留域属性,不想忽略或删除它们。
为了与不同的基础设施点进行交互,在两个不同的模型结构之间进行拆分并不罕见。在这种情况下,您的基础设施点是:
- 反序列化JSON输入
- 使用EF持久化数据
您可以将JSON输入视为";视图模型";。映射到EF数据库实体的不是您的核心模型,而只是一个用于反序列化数据的低效DTO。对于模型,Domains
只是字符串列表:
[JsonPropertyName("domains")]
public List<string> Domains { get; set; }
此视图模型是应用程序层的本地视图,而不是核心域的一部分。在应用程序逻辑中,反序列化输入后,可以将其映射到域对象。这就是将简单字符串列表转换为Domain
对象列表的地方。(并在任何输出操作中转换回。(
只要映射逻辑(可以通过使用AutoMapper等工具来简化,尽管在这种情况下,逻辑非常简单,并不需要添加更多工具(被封装在应用层中,它就不会污染域逻辑的其余部分。
尽管配置其中一个或两个工具以更顺利地协同工作肯定是可能的,但我经常发现,在依赖特定的DTO和核心域模型之间建立一个简单的转换层要简单得多。
我目前使用Newtonsoft JSON进行序列化和反序列化。我认为这个错误的原因是你在域中写了命名字符串";名称";,但它必须是";名称";。希望它能起作用!