以下代码会抛出异常:
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:读取 Regex 时出现意外标记。路径“RegProp”,第 1 行,位置 15。
最佳答案
更新
看来此问题已在 release 10.0.1 中修复(2017 年 3 月)。
这看起来像是 Json.Net 的 RegexConverter
中的错误类(class)。 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
的行。
您可能想要 report an issue链接回这个 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());
或者,您可以将 [JsonConverter]
属性添加到您的 Regex
类成员,如下所示:
class SimpleClassWithRegex
{
[JsonConverter(typeof(ImprovedRegexConverter))]
public Regex RegProp { get; set; }
}
fiddle :https://dotnetfiddle.net/BIqmd6
关于c# - 使用 json.net 反序列化空正则表达式属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38399966/