正确覆盖Newtonsoft.Json方法

时间:2016-06-17 16:27:45

标签: c# json json.net override

背景

我需要覆盖下面的方法,这样它就会反复排序对象的属性而不会失败。

   JsonConvert.DeserializeObject()

它失败了,因为它试图转换一个包含" Y"或" N"属于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 )
        {
        }

问题

当我对下面的扩展类进行新调用时。

list = BooleanJsonConverter.DeserializeObject<List<T>>(OutJson);

我收到此错误消息。

  

QueueDetail.BooleanJsonConverter&#39;不包含的定义   &#39; DeserializeObject&#39;

问题

我做错了什么?这是我第一次尝试这个,所以我可能会错过一些东西。

如果BooleanJsonConverter继承JsonConverter。为什么BooleanJsonConverter不包含我之前使用过的调用?

1 个答案:

答案 0 :(得分:5)

您尚未告知JsonSerializer使用您的转换器。

请参阅JSON.NET文档:

http://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm

然后您可以尝试这样的呼叫:

JsonConvert.DeserializeObject<<List<T>>(OutJson, new BooleanJsonConverter(typeof(<List<T>)));

您也可以在T对象中使用Json atributte。

 [JsonConverter(typeof(BooleanJsonConverter))]