我已经看到了许多不同的JSON日期格式标准:
"\"\\/Date(1335205592410)\\/\"" .NET JavaScriptSerializer
"\"\\/Date(1335205592410-0500)\\/\"" .NET DataContractJsonSerializer
"2012-04-23T18:25:43.511Z" JavaScript built-in JSON object
"2012-04-21T18:25:43-05:00" ISO 8601
Run Code Online (Sandbox Code Playgroud)
哪一个是正确的?还是最好的?这有什么标准吗?
我正在开发一个API来使用ASP.NET Web API公开一些数据.
在其中一个API中,客户希望我们以yyyy-MM-dd格式显示日期.我不想更改全局设置(例如GlobalConfiguration.Configuration.Formatters.JsonFormatter),因为它非常特定于此客户端.我在多个客户的解决方案中进行开发.
我能想到的解决方案之一是创建一个自定义JsonConverter,然后将其放入我需要进行自定义格式化的属性
例如
class ReturnObjectA
{
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime ReturnDate { get;set;}
}
Run Code Online (Sandbox Code Playgroud)
只是想知道是否还有其他一些简单的方法.
如何将UTC日期传递给Web API?
传递2010-01-01工作正常,但是当我传递UTC日期(例如2014-12-31T22:00:00.000Z时间组件)时,我得到HTTP 404响应.所以
http://domain/api/controller/action/2012-12-31T22:00:00.000Z
Run Code Online (Sandbox Code Playgroud)
产生404错误响应,而
http://domain/api/controller/action/2012-12-31
Run Code Online (Sandbox Code Playgroud)
工作良好.
那么如何将UTC日期传递给Web API - 或者至少指定日期和时间?
我正在尝试使用System.Text.Json.JsonSerializer来部分反序列化模型,因此其中一个属性被读取为包含原始 JSON 的字符串。
public class SomeModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Info { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
示例代码
var json = @"{
""Id"": 1,
""Name"": ""Some Name"",
""Info"": {
""Additional"": ""Fields"",
""Are"": ""Inside""
}
}";
var model = JsonSerializer.Deserialize<SomeModel>(json);
Run Code Online (Sandbox Code Playgroud)
应该生成模型,该Info属性包含来自原始 JSON 的 Info 对象作为字符串:
{
"Additional": "Fields",
"Are": "Inside"
}
Run Code Online (Sandbox Code Playgroud)
它不能开箱即用并引发异常:
System.Text.Json.JsonException: ---> System.InvalidOperationException: 无法以字符串形式获取标记类型“StartObject”的值。
到目前为止我尝试了什么:
public class InfoToStringConverter : JsonConverter<string>
{
public override …Run Code Online (Sandbox Code Playgroud) 我一直在从 2.2 迁移到 3.0,到目前为止一切都非常顺利,但是当用新的 System.Text.Json 替换 Newtonsoft 时,我遇到了以下问题。
尝试使用 UTC 偏移量反序列化 DateTime 最小值时,会引发以下异常
未处理的异常。System.Text.Json.JsonException:无法将 JSON 值转换为 System.DateTime。路径:$.DateCreated | 行号:2 | 字节位置内联:43
例子:
using System;
using Newtonsoft.Json;
class Program
{
static void Main(string[] args)
{
var json = "{\"MyDateTime\": \"0001-01-01T00:00:00+01:00\"}";
var newtonDeserialized = JsonConvert.DeserializeObject<Class>(json);
//Bad things happen here.
var systemDeserialized = System.Text.Json.JsonSerializer.Deserialize<Class>(json);
Console.WriteLine(newtonDeserialized.MyDateTime);
Console.WriteLine(systemDeserialized.MyDateTime);
}
}
class Class
{
public DateTime MyDateTime {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
在线示例可以在这里找到Fiddle。
我想我可以编写自己的 DateTime 序列化程序,但必须有一种更简单/更简洁的方法来完成 Newtonsoft 所做的工作而无需任何配置。
这发生在3.0.100,3.1.500并且5.0.100