反序列化 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);
}
}
下面是我如何尝试将其 link 放入全球转换器列表中:
JsonConvert.DefaultSettings = () =>
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new EdmDateConverter());
//settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
return settings;
};
我遇到了和以前一样的错误,所以要么没有正确添加转换器,要么我没有正确编写它。
谁能给我一些关于这个问题的指导?
您的错误消息表明正在反序列化的成员类型是 Nullable<Microsoft.OData.Edm.Date>
,但您的 CanConvert
method is not accounting for the possibility that objectType
might be nullable.
您可以通过如下修改 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# 类.
我正在使用 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);
}
}
下面是我如何尝试将其 link 放入全球转换器列表中:
JsonConvert.DefaultSettings = () =>
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new EdmDateConverter());
//settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
return settings;
};
我遇到了和以前一样的错误,所以要么没有正确添加转换器,要么我没有正确编写它。
谁能给我一些关于这个问题的指导?
您的错误消息表明正在反序列化的成员类型是 Nullable<Microsoft.OData.Edm.Date>
,但您的 CanConvert
method is not accounting for the possibility that objectType
might be nullable.
您可以通过如下修改 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# 类.