2016-07-15 14 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 
} 

これは私には奇妙な行動のように思える、誰かが説明できますか?おそらく回避策を提案しますか? ヌルの代わりにRegexオブジェクトをインスタンス化することはもちろん、例外をスローしないようにします。

生成例外は次のとおりです。

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

答えて

3

UPDATE

この問題はrelease 10.0.1(2017年3月)で修正されたことが表示されます。


これはJson.NetのRegexConverterクラスのバグのように見えます。あなたが見ることができるように

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スローラインに至るまで低下している:ReadJson方法は次のようになります。

このような質問にリンクしてreport an issueにリンクしてください。

回避策として、あなたは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、あなたはこのようなあなたのRegexクラスのメンバーに[JsonConverter]属性を追加することができます

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

フィドル:https://dotnetfiddle.net/BIqmd6

+0

ありがとうございました。私はバグレポートを提出することも検討しなければならない。 –

関連する問題