Десериализация 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;
};
Я получаю ту же ошибку, что и раньше, поэтому либо конвертер не добавляется правильно, либо он не написан должным образом.
Кто-нибудь может дать мне несколько советов по этому вопросу?
1 ответ
Ваше сообщение об ошибке указывает на то, что десериализованный тип члена Nullable<Microsoft.OData.Edm.Date>
, но твой CanConvert
Метод не учитывает возможность того, что objectType
может быть обнуляемым.
Вы можете исправить это, изменив 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;
}
}
Заметки:
Это также необходимо для проверки на
null
токен вReadJson()
,WriteJson()
с другой стороны, никогда не призывается кnull
значение; вместо этого пишет Json.NETnull
автоматически.С вашим кодом могут быть другие проблемы, поскольку ваш вопрос не включает пример JSON, код десериализации или классы C#.