gpt4 book ai didi

c# - Json DateTime Conversion 在 web api 中返回新的日期时间

转载 作者:行者123 更新时间:2023-11-30 22:19:41 24 4
gpt4 key购买 nike

我有一个 web api Controller 方法,它接受一个复合对象,其中一个属性是 DateTime。当我将对象作为 XML 发布时,一切正常。但是,如果我将其作为 JSON 发布,则会失败。

为了获得有关失败原因的更多信息,我添加了一个自定义日期时间转换器,只需重用 Json.Net 附带的基本 IsoDateTimeConverter,并通过在转换后的值上放置一个断点,我可以看到该值转换正常,但是当它到达模型时,该属性填充了新的日期时间,而不是我发送的值。发送与 XML 完全相同的模型效果很好。

对于事件的顺序以及它如何从转换为日期时间对象然后在绑定(bind)模型时立即丢失,我有点困惑。我在交互的两端使用 Json.Net IsoDateTimeConverter 进行序列化和反序列化。

JSON 设置:

NullValueHandling = NullValueHandling.Ignore,
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
Converters = new JsonConverter[]
{
new StringEnumConverter(),
new IsoDateTimeConverter()
}

在 web api 端用于反序列化的自定义转换器(使用 IsoDateTimeConverter):

public class CustomDateTimeConverter : DateTimeConverterBase
{
IsoDateTimeConverter isoConverter;

public CustomDateTimeConverter()
{
isoConverter = new IsoDateTimeConverter();
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
isoConverter.WriteJson(writer, value, serializer);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var returned = isoConverter.ReadJson(reader, objectType, existingValue, serializer);
return returned;
}
}

模型上的日期属性(两端)

public DateTime DateOfBirth { get; set; }

发布的Json格式:

"DateOfBirth":"1980-02-01T00:00:00"

转换器的值(value):

{01/02/1980 00:00:00}

Controller 中模型的值:

{01/01/0001 00:00:00}

断点时返回的变量显示正确的反序列化日期时间,但之后的模型是一个新的日期时间。

对于这如何反序列化以及决定它没有直接反序列化感到困惑!非常感谢任何帮助。

在进一步调查中,似乎 json 绑定(bind)器通常也无法绑定(bind)属性 - 大量基本字符串属性未正确绑定(bind),因此这可能是另一个问题的一部分。

最佳答案

Json 不做日期。将它们作为字符串传回并在您的客户端脚本中解析它们。

http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx

关于c# - Json DateTime Conversion 在 web api 中返回新的日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15436640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com