繁体   English   中英

反序列化Microsoft.OData.Edm.Date

[英]Deserializing Microsoft.OData.Edm.Date

我正在使用JsonConvert.DeserializeObject来反序列化一个对象,并且该例程遇到了一个它不知道如何处理的日期字段。 这是错误:

Error converting value \"2018-08-22\" to type 
'System.Nullable`1[Microsoft.OData.Edm.Date]'. Path 'value[3].actualclosedate'

Microsoft.OData.Edm.Date是Microsoft用于保存仅日期数据的结构对象。

我正在尝试为这种类型的字段构建自定义转换器,但不能让它正常工作。

这是我的转换器代码:

public class EdmDateConverter : DateTimeConverterBase
{
    public override bool CanConvert(Type objectType) { return objectType == typeof(global::Microsoft.OData.Edm.Date); }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return (global::Microsoft.OData.Edm.Date)global::Microsoft.OData.Edm.Date.Parse(reader.ReadAsString());
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        string myDate = ((global::Microsoft.OData.Edm.Date)value).Year.ToString("D4");
        myDate += "-";
        myDate += ((global::Microsoft.OData.Edm.Date)value).Month.ToString("D2");
        myDate += "-";
        myDate += ((global::Microsoft.OData.Edm.Date)value).Day.ToString("D2");

        writer.WriteValue(myDate);
    }
}

以下是我尝试将其链接到全局转换器列表的方法:

JsonConvert.DefaultSettings = () =>
            {
                var settings = new JsonSerializerSettings();
                settings.Converters.Add(new EdmDateConverter());
                //settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                return settings;
            };

我得到了与以前相同的错误,因此转换器没有正确添加或我没有正确写入。

谁能就这个问题给我一些指导?

您的错误消息表明正在反序列化的成员类型是Nullable<Microsoft.OData.Edm.Date> ,但您的CanConvert方法未考虑objectType可能为的可能性。

您可以通过修改CanConvert来解决此CanConvert ,如下所示:

public class EdmDateConverter : DateTimeConverterBase
{
    public override bool CanConvert(Type objectType) 
    {
        var type = Nullable.GetUnderlyingType(objectType) ?? objectType;
        return type == typeof(global::Microsoft.OData.Edm.Date); 
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.SkipComments().TokenType == JsonToken.Null)
            return null;
        return (global::Microsoft.OData.Edm.Date)global::Microsoft.OData.Edm.Date.Parse(reader.ReadAsString());
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        string myDate = ((global::Microsoft.OData.Edm.Date)value).Year.ToString("D4");
        myDate += "-";
        myDate += ((global::Microsoft.OData.Edm.Date)value).Month.ToString("D2");
        myDate += "-";
        myDate += ((global::Microsoft.OData.Edm.Date)value).Day.ToString("D2");

        writer.WriteValue(myDate);
    }
}

public static partial class JsonExtensions
{
    public static JsonReader SkipComments(this JsonReader reader)
    {
        while (reader.TokenType == JsonToken.Comment && reader.Read())
            ;
        return reader;
    }
}

笔记:

  • ReadJson()检查null标记也是必要的。 另一方面, WriteJson()从不被调用为null值; 相反,Json.NET会自动写入null

  • 您的代码可能存在其他问题,因为您的问题不包括示例JSON,反序列化代码或c#类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM