我有一个 Web API 中间层,它使用一个 API,该 API 公开一个字段,该字段将时间戳记为字符串(该字段是字符串,它包含类似“2016-05-31T14:12:45.753Z”的值)。
中间层的代理类是使用 Visual Studio 从 Swagger 端点生成的,并且在底层使用 Json.NET 反序列化对象。
我可以看到该字段是作为字符串接收的(这很好):
inputObject {{ "When": "2016-05-31T14:12:45.753Z" }} Newtonsoft.Json.Linq.JToken {Newtonsoft.Json.Linq.JObject}
但是,即使目标字段是字符串,inputObject["When"] 的值也会被解析为时间戳。
inputObject["When"] {31/05/2016 14:12:45} Newtonsoft.Json.Linq.JToken {Newtonsoft.Json.Linq.JValue}
然后
JToken whenValue = inputObject["When"];
if (whenValue != null && whenValue.Type != JTokenType.Null)
{
this.When = ((string)whenValue);
}
最后 this.When
是一个字符串,值为 31/05/2016 14:12:45
。
是否有一个选项可以防止 json.net 解析日期然后再次将其转换为字符串?
请记住,这种转换发生在自动生成的代码中,所以我正在寻找某种方式来装饰服务器端的字段,这将使 Swagger 以某种方式标记它,然后生成的类将避免反序列化/序列化问题。
类似于:
[JsonProperty("This really is a string, leave it alone")]
public string When { get; private set; }
最佳答案
(回答我自己的问题)
我需要一个快速的解决方案,这是我的临时解决方案,以供记录。
我将日期格式化为
"When": "2016-05-31 14:12:45"
而不是
"When": "2016-05-31T14:12:45.753Z"
这可以防止它被解释。前端 (javascript) 代码知道来自 API 的时间戳是 UTC,它会在将时间戳转换为本地时间并格式化显示之前附加“Z”,例如:
<td>{{vm.prettyDateTimeFormat(item.StatusDate+'Z')}}</td>
控制码:
vm.prettyDateTimeFormat = function (dateString)
{
var momentDate = moment(dateString, "YYYY-MM-DD HH:mm:ssZZ");
if (typeof(momentDate) === "undefined" || (!momentDate.isValid()))
{
return dateString;
}
//The format needs to be sortable as it ends up in the grid.
var nicePrettyDate = momentDate.format('YYYY-MM-DD HH:mm:ss');
return nicePrettyDate;
}
就我不喜欢这个解决方案而言,它让我们完成了演示。这个问题显然在积压日志中,现在需要妥善解决。
关于c# - 将日期作为字符串传递 - 防止 json.net 解析日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37587055/