【问题标题】:Type binding asp core 2.2类型绑定 asp core 2.2
【发布时间】: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 同样,模型绑定器不适用于FromBody ValueProvider。需要采取其他措施来解决这个问题。 :-(

标签: c# json asp.net-core model-binding typeconverter


【解决方案1】:

首先Paris/France不是有效的时区文本格式,正确的应该是Europe/Paris

那么我假设你想转换给定的时间

using Newtonsoft.Json.Linq;
using System;
using System.Globalization;
using TimeZoneConverter;

namespace ParseJsonDateTimeZone
{
    class Program
    {
        static void Main(string[] args)
        {
            string json = "{\"id\": 1,\"zoneDate\":{\"zone\":\"Europe/Paris\",\"dateTime\":\"2019-04-02T00:00:00\"}}";
            Console.WriteLine(new Model(json));
        }

        public class Model
        {
            public Model(string json)
            {
                JObject jObject = JObject.Parse(json);
                Id = (int) jObject["id"];
                JToken zoneDate = jObject["zoneDate"];
                TimeZoneInfo tzi;
                try
                {
                    tzi = TZConvert.GetTimeZoneInfo(zoneDate["zone"].ToString());
                }
                catch(TimeZoneNotFoundException)
                {
                    // Fallback to UTC or do something else?
                    tzi = TZConvert.GetTimeZoneInfo("UTC");
                }
                CultureInfo culture = CultureInfo.InvariantCulture;
                DateTime dateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.Parse(zoneDate["dateTime"].ToString()), tzi);
                DateTime = TimeZoneInfo.ConvertTime(dateTime, tzi );
            }
            public int Id { get; set; }
            public DateTime DateTime { get; set; }
        }

    }
}

【讨论】:

  • 我在我的问题中说过:我有一个服务,它知道如何将复杂的 json 对象 zoneDate 转换为带有偏移量的 .Net DateTime。。因此问题不是关于转换,而是关于可以将所有zoneDate 映射到DateTime 的所有asp 核心响应的全局机制。 ModelBinder 是此类映射的示例,但它适用于请求,而我需要此类映射来响应。无论如何,谢谢您,先生,您的努力
猜你喜欢
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 2020-04-09
  • 1970-01-01
  • 2019-07-31
  • 2019-01-27
相关资源
最近更新 更多