【发布时间】:2019-09-09 17:56:46
【问题描述】:
我的 asp 核心 api 作为输入对象,具有以下 json 结构:
{
"id": 1,
"zoneDate": {
"zone": "Paris/France",
"dateTime": "2019-04-02T00:00:00"
}
}
我想将此对象转换为以下模型:
public class Model
{
public int Id { get; set; }
public DateTime DateTime { get; set; }
}
我有一个服务,它知道如何将复杂的 json 对象 zoneDate 转换为带有偏移量的 .Net DateTime。
每当在模型中看到DateTime 时,我需要 api 自动进行转换(在模型绑定中),该模型标有一些自定义属性(或者如果有的话是内置的)。有什么想法可以优雅地做到这一点吗?有没有像TypeConverter 这样的东西可以在单个simple type 属性上工作并且可以使用parameter injected through constructor?非常感谢任何帮助!
编辑:
我需要属性级别的绑定,而不是模型级别的绑定。我的意思是,如果我使用模型绑定器,那么我需要为每个具有应该从 ZoneDate json 创建的 DateTime 道具的新模型创建它。那不是我想要的。我想将ZoneDate 视为简单类型,当我将其转换为具有属性或某些名称约定的DateTime 时
更新: 终于,@jpgrassi 的建议被执行了。
与其编写这些活页夹,不如将复杂性隐藏起来。 为什么不引入包含这些字段的类型 ZoneDate 并让 默认的modelbinder做它的工作?最后,你会得到什么 从接受该格式并自己绑定它?我认为有一个 类型要好得多。你让编译器帮你做些事情 (重构等)。另外你的代码很简单。
【问题讨论】:
-
您可以使用自定义模型绑定器。如果你有你的服务来转换它,你甚至可以通过 DI 容器得到它。检查这个:docs.microsoft.com/en-us/aspnet/core/mvc/advanced/…
-
啊,我明白了,抱歉我误解了你的问题。这比我想象的要复杂一些。我有一些问题:您是否希望在您的 API 中始终使用这种
zoneDate格式?现在我不知道自动(即使使用属性)获取传入的 json 字符串并分配给该属性的方法。使用自定义活页夹,您可以自动注册,但如果这会出现在其他模型中,那么我会采用不同的方式来解决这个问题。 -
与其编写这些绑定器,只是隐藏复杂性。为什么不引入一个包含这些字段的类型
ZoneDate并让默认的模型绑定器工作呢?最后,你会从接受这种格式并自己绑定它中获得什么?我认为有一个类型会更好。您让编译器帮助您处理一些事情(重构等)。另外,您的代码很简单。 -
@jpgrassi 先生,您的观点非常合理。我只是想获得一些在幕后自动执行转换的方法。因为,无论如何,我应该将
ZoneDate转换为DateTime。我什至不想让我的 API 知道 ZoneDate,因为从业务角度来看,它不应该知道它 -
@jpgrassi 同样,模型绑定器不适用于
FromBodyValueProvider。需要采取其他措施来解决这个问题。 :-(
标签: c# json asp.net-core model-binding typeconverter