2012-03-28 28 views
5

में डिफॉल्ट प्राइमेटिव टाइप हैंडलिंग ओवरराइड करना क्या प्राचीन प्रकारों को संभालने पर Json.net के डिफ़ॉल्ट deserialization व्यवहार को ओवरराइड करने का कोई तरीका है? उदाहरण के लिए जब object[]3.14 का एक प्रकार के लिए json सरणी [3.14,10,"test"] deserializing प्रकार double का हो जाएगा और प्रकार long का हो जाएगा। क्या वैसे भी मैं इस प्रकार के फैसले को रोक या ओवरराइड कर सकता हूं ताकि मैं मूल्यों को decimal और int क्रमशः deserialize कर सकता हूं?Json.Net

मैं मूल रूप से हमेशा जेसन पूर्णांक को int के रूप में वापस लौटना चाहता हूं और decimal के रूप में वापस लौटने के लिए तैरता हूं। यह मुझे मेरे कोड में double से decimal रूपांतरण इंजेक्ट करने के लिए कुछ बचाएगा।

मैंने 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 के अपने रिलीज में आभासी के रूप में चिह्नित नहीं है, इसलिए ओवरराइड एक 'ओवरराइड के लिए कोई उपयुक्त विधि' फेंक रहा है। क्या मैं कुछ भूल रहा हूँ? –

+0

@MatthewRuston मेरा वर्तमान Json.Net संस्करण '4.0.5' है। –

+0

ऐसा लगता है कि उन्होंने हालिया रिलीज में वर्चुअल प्रॉपर्टी को हटा दिया है। अजीब। –