2015-07-31 18 views
6

Sto deserializzando un oggetto utilizzando Json.NET che contiene un campo privato di tipo Guid e una proprietà pubblica per quel campo. Quando il valore per il mio Guid è nullo nel mio json voglio assegnare Guid.Empty al mio campo.deserializzazione di Json.net null guid case

public class MyClass 
{ 
    private Guid property; 
    public Guid Property 
    { 
     get { return property; } 
     set 
     { 
      if (value == null) 
      { 
       property = Guid.Empty; 
      } 
      else 
      { 
       property = value; 
      } 
     } 
    } 
} 

Ma la deserializer vuole accedere al campo privato, perché ottengo questo errore quando provo a deserializzare:

Errore che converte il valore {null} digitare 'System.Guid'. Percorso '[0] .property', linea 6, la posizione 26.

Come posso rendere più ignorare il campo privato e utilizzare la proprietà pubblica, invece?

risposta

8

Json.NET rifiuta di impostare un valore null per un Guid perché è un tipo di valore non annullabile. Prova a digitare (Guid)null nello Immediate Window e vedrai un messaggio di errore che indica che questa conversione non può essere effettuata in .Net.

Per risolvere questo, avete un paio di opzioni:

  1. Creare un annullabile proprietà procura Guid?. Può essere privato, se si desidera fintanto che ha un attributo [JsonProperty]:

    public class MyClass 
    { 
        [JsonIgnore] 
        public Guid Property { get; set; } 
    
        [JsonProperty("Property")] 
        Guid? NullableProperty { get { return Property == Guid.Empty ? null : (Guid?)Property; } set { Property = (value == null ? Guid.Empty : value.Value); } } 
    } 
    
  2. Creare un JsonConverter che converte un JSON Token null ad un valore predefinito Guid:

    public class MyClass 
    { 
        [JsonConverter(typeof(NullToDefaultConverter<Guid>))] 
        public Guid Property { get; set; } 
    } 
    
    public class NullToDefaultConverter<T> : JsonConverter where T : struct 
    { 
        public override bool CanConvert(Type objectType) 
        { 
         return objectType == typeof(T); 
        } 
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
        { 
         var token = JToken.Load(reader); 
         if (token == null || token.Type == JTokenType.Null) 
          return default(T); 
         return token.ToObject(objectType); 
        } 
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
        { 
         if (EqualityComparer<T>.Default.Equals((T)value, default(T))) 
          writer.WriteNull(); 
         else 
          writer.WriteValue(value); 
        } 
    } 
    
+0

Grazie ! Una domanda sul convertitore da null a predefinito. Devo aggiungere manualmente l'attributo JsonConverter a ogni campo/proprietà nella mia classe o posso in qualche modo aggiungerlo per tutte le proprietà della classe? – Adrian

+1

È possibile aggiungerlo a ciascuna proprietà o registrarlo per l'utilizzo a livello globale in tutte le classi. Vedi [Registrare un JsonConverter personalizzato in Json.Net] (http://stackoverflow.com/questions/19510532/registering-a-custom-jsonconverter-in-json-net). – dbc