以下代码将引发异常:
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.
更新
此问题似乎已在版本 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
| 归档时间: |
|
| 查看次数: |
479 次 |
| 最近记录: |