覆盖Json.Net中的默认原始类型处理

有没有办法在处理原始类型时覆盖Json.net的默认反序列化行为? 例如,当将json数组[3.14,10,"test"]反序列[3.14,10,"test"]某种类型的object[] 3.14将为double类型, 10将为long类型。 无论如何我可以截取或覆盖这种类型的决定,所以我可以分别将值反序列化为decimalint

我基本上总是希望json整数总是作为int返回并且浮点数以decimal返回。 这将节省我一些必须在我的代码中注入doubledecimal转换。

我已经考虑扩展Newtonsoft.Json.Serialization.DefaultContractResolver并实现我自己的Newtonsoft.Json.JsonConverter但我还没有找到任何方法来实现这个所需的覆盖。

要重现的示例代码

 object[] variousTypes = new object[] {3.14m, 10, "test"}; string jsonString = JsonConvert.SerializeObject(variousTypes); object[] asObjectArray = JsonConvert.DeserializeObject(jsonString); // Contains object {double}, object {long}, object {string} 

我认为,这应该有效

 public class MyReader : JsonTextReader { public MyReader(string s) : base(new StringReader(s)) { } protected override void SetToken(JsonToken newToken, object value) { object retObj = value; if (retObj is long) retObj = Convert.ChangeType(retObj, typeof(int)); if (retObj is double) retObj = Convert.ChangeType(retObj, typeof(decimal)); base.SetToken(newToken, retObj); } } object[] variousTypes = new object[] { 3.14m, 10, "test" }; string jsonString = JsonConvert.SerializeObject(variousTypes); JsonSerializer serializer = new JsonSerializer(); var asObjectArray = serializer.Deserialize(new MyReader(jsonString));