正确覆盖 Newtonsoft.Json 方法
Correctly Override Newtonsoft.Json Method
背景
我需要重写下面的方法,这样它就可以反序列化一个对象的 属性 而不会失败。
JsonConvert.DeserializeObject()
失败是因为它试图将包含 "Y" 或 "N" 的密钥对值转换为布尔类型的 属性。
这是错误
Could not convert string to boolean: Y.
我是这样调用方法的:
private List<T> GetBindingSource<T>(List<T> list, string JsonKey, Dictionary<string, string> dictOriginalJSON)
{
var OutJson = "";
if (dictOriginalJSON.TryGetValue(JsonKey, out OutJson))
{
list = JsonConvert.DeserializeObject<List<T>>(OutJson); //Call fails here
}
return list;
}
我尝试的解决方案
阅读完这个问题后,最好的办法似乎是重写该方法。我通过 #entre
选择了这个解决方案
How to get newtonsoft to deserialize yes and no to boolean
using System;
using Newtonsoft.Json;
namespace JsonConverters
{
public class BooleanJsonConverter : JsonConverter
{
public override bool CanConvert( Type objectType )
{
return objectType == typeof( bool );
}
public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer )
{
switch ( reader.Value.ToString().ToLower().Trim() )
{
case "true":
case "yes":
case "y":
case "1":
return true;
case "false":
case "no":
case "n":
case "0":
return false;
}
// If we reach here, we're pretty much going to throw an error so let's let Json.NET throw it's pretty-fied error message.
return new JsonSerializer().Deserialize( reader, objectType );
}
public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer )
{
}
问题
当我对扩展 class 进行新调用时,如下所示。
list = BooleanJsonConverter.DeserializeObject<List<T>>(OutJson);
我收到此错误消息。
QueueDetail.BooleanJsonConverter' does not contain a definition for
'DeserializeObject'
问题
我做错了什么?这是我第一次尝试这样做,所以我很可能会遗漏一些东西。
如果BooleanJsonConverter
继承JsonConverter
。为什么 BooleanJsonConverter 不包含我之前使用的调用?
您还没有告诉 JsonSerializer
使用您的转换器。
在此处查看 JSON.NET 的文档:
http://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm
那么你可以尝试这样调用:
JsonConvert.DeserializeObject<<List<T>>(OutJson, new BooleanJsonConverter(typeof(<List<T>)));
您还可以在您的 T 对象中使用 Json 属性。
[JsonConverter(typeof(BooleanJsonConverter))]
背景
我需要重写下面的方法,这样它就可以反序列化一个对象的 属性 而不会失败。
JsonConvert.DeserializeObject()
失败是因为它试图将包含 "Y" 或 "N" 的密钥对值转换为布尔类型的 属性。
这是错误
Could not convert string to boolean: Y.
我是这样调用方法的:
private List<T> GetBindingSource<T>(List<T> list, string JsonKey, Dictionary<string, string> dictOriginalJSON)
{
var OutJson = "";
if (dictOriginalJSON.TryGetValue(JsonKey, out OutJson))
{
list = JsonConvert.DeserializeObject<List<T>>(OutJson); //Call fails here
}
return list;
}
我尝试的解决方案
阅读完这个问题后,最好的办法似乎是重写该方法。我通过 #entre
选择了这个解决方案How to get newtonsoft to deserialize yes and no to boolean
using System;
using Newtonsoft.Json;
namespace JsonConverters
{
public class BooleanJsonConverter : JsonConverter
{
public override bool CanConvert( Type objectType )
{
return objectType == typeof( bool );
}
public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer )
{
switch ( reader.Value.ToString().ToLower().Trim() )
{
case "true":
case "yes":
case "y":
case "1":
return true;
case "false":
case "no":
case "n":
case "0":
return false;
}
// If we reach here, we're pretty much going to throw an error so let's let Json.NET throw it's pretty-fied error message.
return new JsonSerializer().Deserialize( reader, objectType );
}
public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer )
{
}
问题
当我对扩展 class 进行新调用时,如下所示。
list = BooleanJsonConverter.DeserializeObject<List<T>>(OutJson);
我收到此错误消息。
QueueDetail.BooleanJsonConverter' does not contain a definition for 'DeserializeObject'
问题
我做错了什么?这是我第一次尝试这样做,所以我很可能会遗漏一些东西。
如果BooleanJsonConverter
继承JsonConverter
。为什么 BooleanJsonConverter 不包含我之前使用的调用?
您还没有告诉 JsonSerializer
使用您的转换器。
在此处查看 JSON.NET 的文档:
http://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm
那么你可以尝试这样调用:
JsonConvert.DeserializeObject<<List<T>>(OutJson, new BooleanJsonConverter(typeof(<List<T>)));
您还可以在您的 T 对象中使用 Json 属性。
[JsonConverter(typeof(BooleanJsonConverter))]