2016-11-21 79 views
1

我想创建一个对象[]的json转换器来定义我想要的类型(例如int32而不是int64)。如何正确覆盖对象[]的ReadJson方法?

这是我得到了到现在为止:

对象:

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

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

主:

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

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

的JsonConverter:

namespace Newtonsoft.Json 
{ 
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) 
    { 
     List<object> resultado = new List<object>(); 

     string propertyName = reader.Value as string; 
     while (reader.Read()) 
     { 
      object value = null; 

      switch (reader.TokenType) 
      { 
       case JsonToken.Integer: 
        value = Convert.ToInt32(reader.Value); 
        resultado.Add(value); 
        break; 
       case JsonToken.Float: 
        value = Convert.ToDecimal(reader.Value); 
        resultado.Add(value); 
        break; 
       case JsonToken.String: 
        value = Convert.ToString(reader.Value); 
        resultado.Add(value); 
        break; 
       case JsonToken.Boolean: 
        value = Convert.ToBoolean(reader.Value); 
        resultado.Add(value); 
        break; 
       case JsonToken.Null: 
        value = null; 
        resultado.Add(value); 
        break; 
       case JsonToken.Date: 
        value = Convert.ToDateTime(reader.Value); 
        resultado.Add(value); 
        break; 
       case JsonToken.Bytes: 
        value = Convert.ToByte(reader.Value); 
        resultado.Add(value); 
        break; 
       default: 
        Console.WriteLine("Default case"); 
        Console.WriteLine(reader.TokenType.ToString()); 
        break; 
      } 
     } 

     return resultado.ToArray(); 
    } 

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

    #endregion 
    } 
} 

我检查了输出一切都很好,h H但是它返回我反序列化以下错误:反序列化对象时意外结束:

类型的未处理的异常“Newtonsoft.Json.JsonSerializationException”发生在Newtonsoft.Json.dll

的附加信息。路径'',第1行,第47位。

任何想法如何解决这个问题?

谢谢!

回答

0

解决这样做,现在我有一个通用的转换器,以我想要的格式:

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 
}