我有一个Web API中间层,它使用一个API,它暴露一个带有时间戳为字符串的字段(字段是字符串,它包含一个像“2016-05-31T14:12:45.753Z”这样的值)。 / p>
中间层中的代理类是使用Swagger端点的Visual Studio生成的,并且使用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; }
答案 0 :(得分:0)
(回答我自己的问题)
我需要一个快速的解决方案,这是我的临时解决方案,用于记录。
我将日期格式化为
"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>
ctrl代码:
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;
}
就我不喜欢这个解决方案而言,它带我们完成了演示。这个问题显然在后面的日志中,现在要正确处理。
答案 1 :(得分:-1)
[JsonIgnore]
public string When { get; private set; }