如何在WebApi方法[c#]中从JSON读取日期时间
我用C#中的Web API构建了一个简单的Web服务 此web服务可以接受带有DateTime字段的JSON 这是我的Json:如何在WebApi方法[c#]中从JSON读取日期时间,c#,json,datetime,C#,Json,Datetime,我用C#中的Web API构建了一个简单的Web服务 此web服务可以接受带有DateTime字段的JSON 这是我的Json: { "sensorId" : "sensoreDiProva", "values" : [ { "image":"###base64data###", "image_width": 100, "image_height": 100, "timestamp": "01/29/2016 14:27:30:200", "type": "BLOB", "
{
"sensorId" : "sensoreDiProva",
"values" :
[
{
"image":"###base64data###",
"image_width": 100,
"image_height": 100,
"timestamp": "01/29/2016 14:27:30:200",
"type": "BLOB",
"rectangles":
{
"n_rects": 2,
}
}
]
}
这是方法c#
如果您没有使用第三方库解析json,则日期值必须为Microsoft json日期格式。Microsoft的Javascript序列化程序和DataContract序列化程序使用Microsoft json日期格式,如
/date(1224043200000)/
,因此您必须以该格式将数据发布到API端点
如果您将下面的JSON数据发布到API端点,您将获得一个有效日期
{
"sensorId": "sensoreDiProva",
"values": [{
"image": "###base64data###",
"image_width": 100,
"image_height": 100,
"timestamp": "/Date(1224043200000)/",
"type": "BLOB",
"rectangles": {
"n_rects": 2,
}
}]
}
/日期(1224043200000)/等于15.10.2008 04:00:00
有关Microsoft json日期时间格式的有用链接;
,
PS:1224043200000是刻度,因此您可以在客户机中创建它
希望这对您的问题有所帮助我已用以下代码解决了我的问题:
public class CustomDateTimeConverter : DateTimeConverterBase//IsoDateTimeConverter
{
/// <summary>
/// DateTime format
/// </summary>
private const string Format = "MM/dd/yyyy hh:mm:ss.fff";
/// <summary>
/// Writes value to JSON
/// </summary>
/// <param name="writer">JSON writer</param>
/// <param name="value">Value to be written</param>
/// <param name="serializer">JSON serializer</param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(((DateTime)value).ToString(Format));
}
/// <summary>
/// Reads value from JSON
/// </summary>
/// <param name="reader">JSON reader</param>
/// <param name="objectType">Target type</param>
/// <param name="existingValue">Existing value</param>
/// <param name="serializer">JSON serialized</param>
/// <returns>Deserialized DateTime</returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value == null)
{
return null;
}
var s = reader.Value.ToString();
DateTime result;
if (DateTime.TryParseExact(s, Format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
{
return result;
}
return DateTime.Now;
}
}
我不喜欢解析JSON。如果我试图检查immagini.timestamp,我无法读取正确的datetimeSorry,我误解了流程,现在意识到调用API方法时是自动解析的。您现在正在本地运行吗?您机器上的语言设置是什么?有那么多西班牙语?在您的评论中,您的机器以
dd/MM/yyyy
格式查找日期是有意义的,因此1/29/2016
不是有效日期,因此将解析为DateTime.MinValue
。这是什么类型的API?MVCWebAPI?WCFRestAPI?或者其他我的机器的语言是意大利语我必须以这种格式传递日期“01/29/2016 14:27:30:200”,因此您必须实现使用Newtonsoft的序列化提供程序,或者您必须将时间戳属性作为字符串发送,然后将其解析为DateTime对象。但就个人而言,如果您有机会在将数据发布到API端点之前解析datetime,那么最好的方法就是实现提供程序或将datetime发布为字符串。
public class CustomDateTimeConverter : IsoDateTimeConverter
{
public CustomDateTimeConverter()
{
base.DateTimeFormat = "MM/dd/yyyy hh:mm:ss.fff";
}
}
{
"sensorId": "sensoreDiProva",
"values": [{
"image": "###base64data###",
"image_width": 100,
"image_height": 100,
"timestamp": "/Date(1224043200000)/",
"type": "BLOB",
"rectangles": {
"n_rects": 2,
}
}]
}
public class CustomDateTimeConverter : DateTimeConverterBase//IsoDateTimeConverter
{
/// <summary>
/// DateTime format
/// </summary>
private const string Format = "MM/dd/yyyy hh:mm:ss.fff";
/// <summary>
/// Writes value to JSON
/// </summary>
/// <param name="writer">JSON writer</param>
/// <param name="value">Value to be written</param>
/// <param name="serializer">JSON serializer</param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(((DateTime)value).ToString(Format));
}
/// <summary>
/// Reads value from JSON
/// </summary>
/// <param name="reader">JSON reader</param>
/// <param name="objectType">Target type</param>
/// <param name="existingValue">Existing value</param>
/// <param name="serializer">JSON serialized</param>
/// <returns>Deserialized DateTime</returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value == null)
{
return null;
}
var s = reader.Value.ToString();
DateTime result;
if (DateTime.TryParseExact(s, Format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
{
return result;
}
return DateTime.Now;
}
}
[JsonConverter(typeof(CustomDateTimeConverter))]
[DataMember(Name = "timestamp")]
public DateTime timestamp { get; set; }