Json.NET IsoDateTimeConverter不适用于Mono

时间:2014-08-21 21:26:52

标签: c# mono json.net

2014-07-21T21:47:13.032415435Z将此值反序列化为DateTime字段会出现以下错误:

  

{System.FormatException:字符串未被识别为有效的DateTime。   at System.DateTime.Parse(System.String s,IFormatProvider provider,DateTimeStyles styles)[0x00027] in /Volumes/build-root-ramdisk/mono-3.8.0/mcs/class/corlib/System/DateTime.cs:845   在Newtonsoft.Json.Converters.IsoDateTimeConverter.ReadJson(Newtonsoft.Json.JsonReader reader,System.Type objectType,System.Object existingValue,Newtonsoft.Json.JsonSerializer serializer)[0x00000] in:0   在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(Newtonsoft.Json.JsonConverter转换器,Newtonsoft.Json.JsonReader reader,System.Type objectType,System.Object existingValue)[0x00000] in:0   ...

以下是一些代码示例:

namespace DemoClient
{
[DataContractAttribute]
public class DemoType
{
    [DataMember(Name = "Created")]
    public DateTime Created;

    public DemoType ()
    {
    }
}

class MainClass
{
    public static void Main (string[] args)
    {
        var demoType = JsonConvert.DeserializeObject<DemoType> (
               "{\"Created\":\"2014-08-25T01:20:23.60191161Z\"}", new[]{new IsoDateTimeConverter()});
    }
}

我在使用Mono 3.8.0 for Mac。

2 个答案:

答案 0 :(得分:1)

我正好在一个项目上工作,我正在使用JSON.Net。我使用您提供的字符串示例组合了一个单元测试。它没有错误地转换:

public void ProcessDataItemTest()
{
    string value = "{\"date\":\"2014-07-21T21:47:13.032415435Z\"}";

    try
    {
        var x = JsonConvert.DeserializeObject<DateTest>(value);
        var d = x.date;
        Console.WriteLine(d.ToString()); //output: 7/21/2014 9:47:13 PM
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

internal class DateTest
{
    public DateTime date { get; set; }
}

答案 1 :(得分:0)

这是一个单声道的bug,而不是json.net

我在尝试解析Docker api响应时遇到了同样的错误(相同的变量名为Created,iso日期字符串中的小数长度相同)

一切都在微软框架上工作,而不是单声道,我相信因为单声道解析函数只能解析最多7位小数的​​iso日期字符串。

无论如何,错误已经修复(参见this commit),而DateTime.Parse正在处理最新的单声道(3.10.1)