我正在尝试为对象[]创建一个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位。
知道如何解决这个问题吗?
感谢!!!
答案 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
}