在从json反序列化布尔值时遇到一些困难。我需要该值不区分大小写(faLSe
,tRUE
等),如果它是无效值(例如: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
我做错了什么?
答案 0 :(得分:0)
如果您查看DeserializeObject的源代码,它将使用JsonTextReader类来解析Json。如果查看JsonTextReader的源代码,它将仅解析“ true”(如果第一个字符为小写字母t)或“ false”(如果第一个字符为小写字母f)字符串(第1720行),则在任何其他情况。
实现所需功能的最简单方法是下载完整的Newtonsoft.Json源代码,在JsonTextReader.cs中的ParseTrue和ParseFalse方法中添加String.ToLower,重新编译并在项目中使用新的dll。