2016-07-15 18 views
6

Der folgende Code wird eine Ausnahme werfen:Deserialize null regex Eigenschaft mit json.net

class SimpleClassWithRegex 
{ 
    public Regex RegProp { get; set; } 
} 

[TestMethod] 
public void RegexTest() 
{ 
    string json = JsonConvert.SerializeObject(new SimpleClassWithRegex {RegProp = null}); 
    // json = {"RegProp":null} 
    SimpleClassWithRegex obj = JsonConvert.DeserializeObject<SimpleClassWithRegex>(json); 
    //Above line throws a JsonSerializationException 
} 

Dies ist für mich wie seltsame Verhalten scheint, kann jemand erklären, warum dies nicht ein Fehler ist? Oder schlagen Sie vielleicht einen Workaround vor? Instanziieren eines Regex Objekts anstelle der Null wird natürlich verhindern, dass eine Ausnahme ausgelöst wird.

Die Ausnahme hergestellt ist:

Newtonsoft.Json.JsonSerializationException: Unexpected token when reading Regex. Path 'RegProp', line 1, position 15.

Antwort

3

UPDATE

Es scheint, dass dieses Problem in release 10.0.1 (März 2017) festgelegt wurde.


Das sieht wie ein Fehler in RegexConverter Klasse Json.Net. Die ReadJson Methode sieht wie folgt aus:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
{ 
    if (reader.TokenType == JsonToken.StartObject) 
    { 
     return ReadRegexObject(reader, serializer); 
    } 

    if (reader.TokenType == JsonToken.String) 
    { 
     return ReadRegexString(reader); 
    } 

    throw JsonSerializationException.Create(reader, "Unexpected token when reading Regex."); 
} 

Wie Sie sehen können, ist es nicht erwartet, oder für einen Null-Token von dem Lesegerät überprüft, so dass er fällt bis zur Linie, die eine JsonSerializationException wirft.

Vielleicht möchten Sie report an issue Verknüpfung zurück zu dieser Frage SO.

Als Abhilfe können Sie Ihren eigenen Konverter aus dem RegexConverter ableiten und den Scheck hinzufügen:

public class ImprovedRegexConverter : RegexConverter 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
     { 
      return null; 
     } 
     return base.ReadJson(reader, objectType, existingValue, serializer); 
    } 
} 

Wenn Sie deserialisieren, eine Instanz des benutzerdefinierten Konverter an das DeserializeObject Methode wie folgt passieren:

SimpleClassWithRegex obj = 
    JsonConvert.DeserializeObject<SimpleClassWithRegex>(json, new ImprovedRegexConverter()); 

Alterntatively, können Sie ein [JsonConverter] Attribut auf Ihre Regex Klassenmitglieder wie folgt hinzu:

Fiddle: https://dotnetfiddle.net/BIqmd6

+0

Vielen Dank für die Problemumgehung. Ich werde auch einen Fehlerbericht einreichen. –

Verwandte Themen