如何正确覆盖对象[]的ReadJson方法?

时间:2016-11-21 22:33:03

标签: c# json.net

我正在尝试为对象[]创建一个json转换器来定义我想要的类型(例如int32而不是int64)。

这是我到现在为止所得到的:

对象:

on(b,a).
on(c,b).
on(d,c).
above(Block2,Block1):- on(X,Y).

主要:

[JsonObject]
public class tipo
{
    public string teste { get; set; }

    [JsonConverter(typeof(TestConverter))]
    public object[] metodos { get; set; }
}

JsonConverter:

    string call = JsonConvert.SerializeObject(new tipo { teste="nota",
    metodos = new object[] { 10, (decimal)10.5, "Teste123" } });

    tipo t = JsonConvert.DeserializeObject<tipo>(call);

我检查了输出,一切正常,但它在反序列化中返回以下错误:

  

Newtonsoft.Json.dll中出现未处理的“Newtonsoft.Json.JsonSerializationException”类型异常

     

其他信息:反序列化对象时意外结束。路径'',第1行,第47位。

知道如何解决这个问题吗?

感谢!!!

1 个答案:

答案 0 :(得分:1)

解决了这个问题,现在我有了一个通用转换器,可以使用我想要的格式:

public class TestConverter : JsonConverter
{
    #region Overrides of JsonConverter

    public override bool CanWrite { get { return false; } }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object value = new object();     

        if (reader.TokenType != JsonToken.Null)
        {
            if (reader.TokenType == JsonToken.StartArray)
            {
                JToken token = JToken.Load(reader);

                List<object> resultado = new List<object>();

                foreach (var Value in token)
                {
                    switch (Value.Type)
                    {
                        case JTokenType.Integer:
                            value = Convert.ToInt32(Value);
                            resultado.Add(value);
                            break;
                        case JTokenType.Float:
                            value = Convert.ToDecimal(Value);
                            resultado.Add(value);
                            break;
                        case JTokenType.String:
                            value = Convert.ToString(Value);
                            resultado.Add(value);
                            break;
                        case JTokenType.Boolean:
                            value = Convert.ToBoolean(Value);
                            resultado.Add(value);
                            break;
                        case JTokenType.Null:
                            value = null;
                            resultado.Add(value);
                            break;
                        case JTokenType.Date:
                            value = Convert.ToDateTime(Value);
                            resultado.Add(value);
                            break;
                        case JTokenType.Bytes:
                            value = Convert.ToByte(Value);
                            resultado.Add(value);
                            break;
                        default:
                            Console.WriteLine("Default case");
                            Console.WriteLine(reader.TokenType.ToString());
                            break;
                    }
                }
                value = resultado.ToArray();
            }
            else
            {
                JValue jValue = new JValue(reader.Value);
                switch (reader.TokenType)
                {
                    case JsonToken.Integer:
                        value = Convert.ToInt32(reader.Value);
                        break;
                    case JsonToken.Float:
                        value = Convert.ToDecimal(reader.Value);
                        break;
                    case JsonToken.String:
                        value = Convert.ToString(reader.Value);
                        break;
                    case JsonToken.Boolean:
                        value = Convert.ToBoolean(reader.Value);
                        break;
                    case JsonToken.Null:
                        value = null;
                        break;
                    case JsonToken.Date:
                        value = Convert.ToDateTime(reader.Value);
                        break;
                    case JsonToken.Bytes:
                        value = Convert.ToByte(reader.Value);
                        break;
                    default:
                        Console.WriteLine("Default case");
                        Console.WriteLine(reader.TokenType.ToString());
                        break;
                }
            }
        }
        return value;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(object);
    }

    #endregion
}