Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在WebApi方法[c#]中从JSON读取日期时间_C#_Json_Datetime - Fatal编程技术网

如何在WebApi方法[c#]中从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", "

我用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",
"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; }