2012-03-15 10 views
5

मैंने बेहतर डेटटाइम बनाने के लिए json.net का उपयोग करना शुरू कर दिया है, लेकिन मैंने देखा है कि मेरी संपत्तियों में से एक को क्रमबद्ध नहीं किया जा रहा है। इसमें कोई सेटटर नहीं है, और इसका गेट ऑब्जेक्ट के किसी अन्य सदस्य पर निर्भर है, उदा।Json.net गेटर प्रॉपर्टी को क्रमबद्ध नहीं किया गया

string serializedObject = JsonConvert.SerializeObject(Data, new IsoDateTimeConverter()); 

किसी को मुझे बताओ कैसे है कि संपत्ति को क्रमानुसार करने यह मजबूर करने के लिए कर सकते हैं:

public int AmountInPence { get; set;} 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 

मैं एक वर्ग कि JsonResult से विरासत और मुख्य लाइन है बनाया है?

संपादित करें: बस स्पष्ट करने के लिए - यह एक सरल उदाहरण था। मैंने इसे प्रतिबिंबित करने के लिए अद्यतन किया है कि मैं पहले दशमलव को int कास्टिंग कर रहा हूं। मैं पहले जांचना भूल गया था, लेकिन संपत्ति आंशिक वर्ग का हिस्सा है, क्योंकि इसे डब्ल्यूसीएफ सेवा से वापस किया जा रहा है। मैं अपनी असेंबली में उस संपत्ति की घोषणा कर रहा हूं, तो क्या यह एक सुराग हो सकता है?

उत्तर

15

Json के साथ गलत कुछ भी नहीं है। शुद्ध। यह केवल गुणों को पढ़ने के क्रमबद्ध क्रमबद्ध कर सकते हैं। समस्या में है अपने AmountInPounds

public decimal AmountInPounds { get { return AmountInPence/100; } } 

क्योंकि आपके / 100 साथ पूर्णांक विभाजन कर रहे हैं तो इसका मतलब है कि आप मिल जाएगा 0AmountInPence अगर है कम से कम 100

आपको क्या करना होगा 100 चिह्नित करने के लिए m suffix उपयोग करने के लिए है decimal के रूप में:

public decimal AmountInPounds { get { return AmountInPence/100m; } } 

AmountInPounds में सही परिणाम प्राप्त करने के। टिप्पणी के बाद

संपादित करें:

गणना की संपत्ति AmountInPounds एक WCF सेवा के उत्पन्न DataContract की एक आंशिक वर्ग में था।

और DataContract में यदि कोई संपत्ति DataMemberAttribute के साथ चिह्नित नहीं है तो ऐसा लगता है कि इसे क्रमबद्ध नहीं किया जाएगा।

तो ओपी के जवाब बगल में:

[JsonPropertyAttribute(DefaultValueHandling = DefaultValueHandling.Include)] 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 

यह भी है काम करता है: जैसे मैं जवाब है, पोस्ट में अधिक विवरण प्रदान नहीं करने के लिए माफी मिल गया है

[System.Runtime.Serialization.DataMemberAttribute()] 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 
+0

धन्यवाद:

मैं AmountInPounds संपत्ति पर एक विशेषता जोड़ने की जरूरत है। मुझे नहीं लगता कि यह इसके कारण है (मैंने अपना प्रश्न संपादित कर लिया है) – NickL

+0

ठीक है, तो आपको अधिक संदर्भ प्रदान करना चाहिए। 'डेटा' क्या है जो आप क्रमबद्ध करने की कोशिश कर रहे हैं? आउटपुट क्या है? चूंकि @StriplingWarrior ने यह भी बताया: जेसनकॉन्टर 'AmountInPounds' को क्रमबद्ध करता है ... – nemesv

+0

डेटा एक ऑब्जेक्ट है - जेसनरसेल की एक संपत्ति। क्या इसे पहले डालना होगा? – NickL

2

यह आपके लिए काम करना चाहिए। LINQPad में निम्नलिखित कार्यक्रम ठीक काम करता है:

void Main() 
{ 
    JsonConvert.SerializeObject(new A(), new IsoDateTimeConverter()).Dump(); 
} 

public class A 
{ 
    public int AmountInPence { get; set;} 
    public decimal AmountInPounds { get { return AmountInPence/100; } } 
} 

आउटपुट:

{ "AmountInPence": 0, "AmountInPounds": 0.0}

1

ठीक लग रहा है, लेकिन मुझे नहीं लगता कि यह अंत में महत्वपूर्ण है।उत्तर के लिए

[JsonPropertyAttribute(DefaultValueHandling = DefaultValueHandling.Include)] 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 
+0

मुझे खुशी है कि आपको एक समाधान मिला है, लेकिन यह अभी भी बहुत अजीब है। क्योंकि मैं आंशिक कक्षाओं या विरासत या नामुमकिन गुणों के साथ आपकी समस्या को पुन: उत्पन्न करने में सक्षम नहीं था। 'न्यूटॉन्सॉफ्ट.जेसन संस्करण 4.0.8' में हमेशा पढ़ने योग्य गुण शामिल थे ... – nemesv

+0

हां, मैंने डब्ल्यूसीएफ सेवा द्वारा बनाई गई कक्षा के अलावा सबकुछ दोहराने का एक अलग समाधान बनाया और यह अपेक्षा के अनुसार काम किया। शायद उस वर्ग पर एक विशेषता है जो Json.Net को उन पाठक गुणों को स्वचालित रूप से क्रमबद्ध करने से रोकती है। आपके समय के लिए धन्यवाद! – NickL

+0

ऐसा लगता है कि 'DataMemberAttribute' भी आपकी समस्या हल करता है, मुझे नहीं पता कि यह Json.net में क्यों एक बग है। हालांकि मैंने इस जानकारी के साथ अपना जवाब भी अपडेट किया है। – nemesv

संबंधित मुद्दे