使用 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 对象来代替 null 当然会阻止它引发异常。

生成的异常是:

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

更新

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


这看起来像 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 问题的问题。

作为解决方法,您可以从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());

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

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

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

相关内容

  • 没有找到相关文章

最新更新