以下代码将引发异常:
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