2016-07-15 45 views
6

下面的代碼會拋出異常:與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 
} 

這似乎是奇怪的行爲對我來說,有人可以解釋爲什麼這是不是一個錯誤?或者,也許建議一個解決方法? 實例化一個代替null的Regex對象當然會阻止它拋出異常。

產生的例外是:

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

回答

3

UPDATE

看來,這個問題是固定在release 10.0.1(三月2017)。


這看起來像在Json.Net的RegexConverter類的錯誤。該ReadJson方法是這樣的:

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."); 
} 

正如你所看到的,它並不期望或檢查來自讀者一個空的道理,所以它是通過哪個拋出一個JsonSerializationException線下降。

你可能想要report an issue鏈接回到這個SO問題。

作爲一種變通方法,您可以從RegexConverter派生自己的轉換器,並添加檢查:

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); 
    } 
} 

當你反序列化,通過自定義轉換器的實例到DeserializeObject方法是這樣的:

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

Alterntatively,您可以在[JsonConverter]屬性添加到您的Regex類成員是這樣的:

class SimpleClassWithRegex 
{ 
    [JsonConverter(typeof(ImprovedRegexConverter))] 
    public Regex RegProp { get; set; } 
} 

小提琴:https://dotnetfiddle.net/BIqmd6

+0

非常感謝您的解決方法。我也將考慮提交一份錯誤報告。 –