2012-03-28 67 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