c# - 使用 json.net 反序列化空正则表达式属性

标签 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
}

这对我来说似乎很奇怪,有人可以解释为什么这不是错误吗?或者建议一个解决方法? 实例化一个 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/

相关文章:

c# - 如何在 Xamarin iOS 中将图标从 UIBarButtonSystemItem 转换为 UIImage

c# - 将代码从 SVN 导入 GIT 失败 - SVN trunk 为空

c# - 是否有 .NET 方法来枚举所有可用的网络打印机?

ajax - 使用knockoutjs构建动态表单

JSON.Net BSON 序列化不正确地处理 DateTimeOffset?

c# - 在代码隐藏中访问外部样式表

c# - ServiceStack ApiKeyAuthProvider 在每个请求上触发 6 个选择语句

c# - 如何让 Newtonsoft 将 bool 序列化为 false,而不是 False 或 "false"

c# - 使用 Json.net 循环 json 数组中的对象 [C#]

c# - 如何使用 GetMethod 获取输入参数类型?