2016-11-21 5 views
1

私は望むタイプ(例えばint64の代わりにint32)を定義するためにオブジェクト[]のjsonコンバータを作成しようとしています。オブジェクト[]の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それは私に直列化復元中に次のエラーが返されますowever:

タイプの未処理の例外「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 
} 
関連する問題