2016-07-15 15 views
6

निम्नलिखित कोड एक अपवाद फेंक देगा:deserialize json.net साथ अशक्त regex संपत्ति

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

अद्यतन

ऐसा लगता है कि इस मुद्दे 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 फेंकता के माध्यम से गिर रही है।

आप इस SO प्रश्न पर वापस लिंक कर सकते हैं 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); 
    } 
} 

जब आप deserialize, इस तरह 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

कामकाज के लिए बहुत बहुत धन्यवाद। मैं एक बग रिपोर्ट दर्ज करने में भी देखेंगे। –

संबंधित मुद्दे