2012-03-28 22 views
5

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

我基本上总是希望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<object[]>(jsonString); // Contains object {double}, object {long}, object {string} 

回答

1

我想,这应该工作

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<object[]>(new MyReader(jsonString)); 
+0

JsonTextReader.SetToken是不是在我json.net 4.5.1的发布,标志着虚拟的,所以覆盖抛出'没有合适的方法来替代'。我错过了什么吗? – 2012-03-28 22:11:33

+0

@MatthewRuston我目前的Json.Net版本是'4.0.5'。 – 2012-03-28 22:13:54

+0

看起来像他们删除了最近版本中的虚拟属性。奇怪。 – 2012-03-28 22:15:03