使用json.net反序列化null regex属性

Geo*_*son 6 c# 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
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很奇怪,有人可以解释为什么这不是一个bug吗?或者也许建议一个解决方法?实例化一个Regex对象代替null当然会阻止它抛出异常.

产生的例外是:

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

Bri*_*ers 3

更新

此问题似乎已在版本 10.0.1(2017 年 3 月)中得到修复。


这看起来像是 Json.NetRegexConverter类中的一个错误。该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.");
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它没有期待或检查来自读取器的空标记,因此它会落入抛出JsonSerializationException.

您可能想要报告链接回此问题的问题。

作为解决方法,您可以从 派生您自己的转换器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);
    }
}
Run Code Online (Sandbox Code Playgroud)

反序列化时,将自定义转换器的实例传递给方法,DeserializeObject如下所示:

SimpleClassWithRegex obj = 
   JsonConvert.DeserializeObject<SimpleClassWithRegex>(json, new ImprovedRegexConverter());
Run Code Online (Sandbox Code Playgroud)

或者,您可以[JsonConverter]Regex类成员添加一个属性,如下所示:

class SimpleClassWithRegex
{
    [JsonConverter(typeof(ImprovedRegexConverter))]
    public Regex RegProp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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