Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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
C# 使用JSON.Net解析ISO持续时间_C#_Asp.net Web Api_Json.net - Fatal编程技术网

C# 使用JSON.Net解析ISO持续时间

C# 使用JSON.Net解析ISO持续时间,c#,asp.net-web-api,json.net,C#,Asp.net Web Api,Json.net,我在Global.asax.cs中有一个Web API项目,具有以下设置: var serializerSettings = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateTimeZoneHandling = DateTimeZoneHandling.Utc }; serializerSettings.Convert

我在
Global.asax.cs
中有一个Web API项目,具有以下设置:

var serializerSettings = new JsonSerializerSettings
    {
        DateFormatHandling = DateFormatHandling.IsoDateFormat, 
        DateTimeZoneHandling = DateTimeZoneHandling.Utc
    };

serializerSettings.Converters.Add(new IsoDateTimeConverter());

var jsonFormatter = new JsonMediaTypeFormatter { SerializerSettings = serializerSettings };
jsonFormatter.MediaTypeMappings.Add(GlobalConfiguration.Configuration.Formatters[0].MediaTypeMappings[0]);

GlobalConfiguration.Configuration.Formatters[0] = jsonFormatter;

WebApiConfig.Register(GlobalConfiguration.Configuration);
尽管如此,Json.Net还是无法解析

它抛出以下错误:

将值“2007-03-01T13:00:00Z/2008-05-11T15:30:00Z”转换为时出错 键入“System.TimeSpan”

我使用的是Json.NETV4.5

我尝试过不同的值,比如“P1M”和wiki页面上列出的其他值,但运气不佳

因此,问题是:

  • 我错过什么了吗
  • 还是我必须编写一些自定义格式化程序

  • 我遇到了同样的问题,现在使用这个自定义转换器将.NET时间跨度转换为ISO 8601持续时间字符串

    public class TimeSpanConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var ts = (TimeSpan) value;
            var tsString = XmlConvert.ToString(ts);
            serializer.Serialize(writer, tsString);
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
            JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
            {
                return null;
            }
    
            var value = serializer.Deserialize<String>(reader);
            return XmlConvert.ToTimeSpan(value);
        }
    
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof (TimeSpan) || objectType == typeof (TimeSpan?);
        }
    }
    
    公共类TimeSpanConverter:JsonConverter
    {
    公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
    {
    var ts=(TimeSpan)值;
    var tsString=XmlConvert.ToString(ts);
    serializer.Serialize(writer,tsString);
    }
    public override object ReadJson(JsonReader reader,Type objectType,object existingValue,
    JsonSerializer(序列化程序)
    {
    if(reader.TokenType==JsonToken.Null)
    {
    返回null;
    }
    var值=序列化程序。反序列化(读取器);
    返回XmlConvert.ToTimeSpan(值);
    }
    公共覆盖布尔CanConvert(类型objectType)
    {
    返回objectType==typeof(TimeSpan)| objectType==typeof(TimeSpan?);
    }
    }
    
    这是最好的解决方案谢谢!在Json解析器中使用XmlConvert感觉有点奇怪,但它工作得很好。是的,真正奇怪的是,使用Xml函数的方法非常相似,这也是在Java中实现这一点所需要的。