2015-04-22 4 views
1

Я пытаюсь десериализовать некоторые json от стороннего поставщика, и иногда он возвращает некоторое недопустимое поле даты (например, -0001-01-01 или что-то еще). Это заставляет процесс генерировать исключение.Игнорирование недопустимого поля при десериализации json в Json.Net

Есть ли способ сказать Json.Net игнорировать поля, которые недействительны?

Благодаря

Matt

+0

Возможно, вам стоит взглянуть на основную причину недействительных данных и сначала устранить ее, прежде чем пытаться обойти ее. –

+0

Похоже, это поле установлено в 'DateTime.MinValue'. Это не обязательно «недействительно». Поскольку 'DateTime' - тип значения, он не может быть нулевым; если вы хотите это разрешить, подумайте о том, чтобы сделать ваши поля типа значений «Nullable». – David

+0

Вы можете пометить свойство с помощью атрибута [XmlIgnore], если вы не хотите его сериализовать – auburg

ответ

2

Чтобы расширить ответ от Дэвида, я использовал пользовательские DateTime нейтрализатор:

public class SafeDateTimeConvertor : DateTimeConverterBase 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     DateTime result; 
     if (DateTime.TryParse(reader.Value.ToString(), out result)) 
      return result; 
     return existingValue; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteValue(((DateTime)value).ToString("yyyy-MM-dd hh:mm:ss")); 
    } 
} 

, который затем применяется так:

var result = JsonConvert.DeserializeObject<TestClass>(json, new SafeDateTimeConvertor()); 
+0

Вместо того, чтобы явно указывать формат, вы можете использовать значение ((DateTime)) .toString («o») - оно соответствует ISO 8601 формат –

1

JSON.NET имеет многочисленные способы управления сериализации. Например, вы можете посмотреть на Conditional Property (De)Serialization.

В онлайн-документах есть целая тема: Serializing Dates.

Вы можете написать собственный конвертер; см. документацию для пространства имен Newtonsoft.Json.Converters.

+0

Я думаю, что пользовательский конвертер - это путь, спасибо –

0

Случается, третьи лица могут пренебречь типобезопасность в их JSON. Я рекомендую вам связаться с ними. У меня был сценарий, в котором свойство было либо строковым массивом, либо «ложным». Json.NET не понравилось, так как временный хак, я создал этот пользовательский конвертер игнорировать исключение десериализации:

public class IgnoreDataTypeConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     try { return JToken.Load(reader).ToObject(objectType); } 
     catch { } 
     return objectType.IsValueType ? Activator.CreateInstance(objectType) : null; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     serializer.Serialize(writer, value); 
    } 
} 

Этот подход «TryConvert» не рекомендуется. Используйте его как временное решение после того, как вы отправите свои мысли дизайнерам создающего JSON, который вы потребляете.

Смежные вопросы