如何从不区分大小写的JSON反序列化布尔值?

时间:2019-09-03 14:50:27

标签: c# json.net json-deserialization

在从json反序列化布尔值时遇到一些困难。我需要该值不区分大小写(faLSetRUE等),如果它是无效值(例如:qwerty),我将返回空值。我创建了一个自定义转换器:

public class NullableBooleanJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // Handle only boolean types.
        return objectType == typeof(bool?);
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        string value = reader?.Value?.ToString();

        if (string.IsNullOrWhiteSpace(value))
        {
            return null;
        }

        if (bool.TryParse(value, out bool deserializedValue))
        {
            return deserializedValue;
        }

        return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
    }
}

我正在使用如下代码:

JsonSerializerSettings setting = new JsonSerializerSettings
    { Converters = new List<JsonConverter> { this.converter } };

JsonConvert.DeserializeObject<bool?>("false", setting).Should().BeFalse();

这可行,但是如果我在最后一行:

JsonConvert.DeserializeObject<bool?>("faLSE", setting).Should().BeFalse();

测试失败,并显示以下消息:

  

TestName引发异常:
  Newtonsoft.Json.JsonReaderException:解析布尔值时出错。路径”,第1行,位置2

我做错了什么?

1 个答案:

答案 0 :(得分:0)

如果您查看DeserializeObject的源代码,它将使用JsonTextReader类来解析Json。如果查看JsonTextReader的源代码,它将仅解析“ true”(如果第一个字符为小写字母t)或“ false”(如果第一个字符为小写字母f)字符串(第1720行),则在任何其他情况。

实现所需功能的最简单方法是下载完整的Newtonsoft.Json源代码,在JsonTextReader.cs中的ParseTrue和ParseFalse方法中添加String.ToLower,重新编译并在项目中使用新的dll。