2016-03-30 10 views
5

मैंने आज न्यूटॉन्सॉफ्ट.जेसन से कुछ अजीब आउटपुट देखा, मुझे यकीन नहीं है कि यह एफ # प्रकारों या सी # में होने वाली कुछ चीज़ों के साथ एक बातचीत है, इसलिए मैंने दोनों को टैग किया है । मैं निम्नलिखित रिकॉर्ड की एक सूची धारावाहिक की जा रही है:न्यूटॉन्सॉफ्ट.जेसन कुछ वस्तुओं को दो बार क्रमबद्ध करना

type SplitTracker = 
    { 
    [<JsonIgnore>] 
    split   : SplitDefinition 
    mutable start : duration 
    mutable ``end`` : duration 
    mutable lapCount : int 
    mutable duration : duration Option 
    } 

मैं JsonConvert.SerializeObject साथ यह क्रमानुसार और मैं निम्नलिखित अजीब आउटपुट प्राप्त:

"splits": [ 
    { 
    "[email protected]": "0.00", 
    "[email protected]": "0.00", 
    "[email protected]": 0, 
    "[email protected]": null, 
    "start": "0.00", 
    "end": "0.00", 
    "lapCount": 0, 
    "duration": null 
    }, 
    { 
    "[email protected]": "0.00", 
    "[email protected]": "0.00", 
    "[email protected]": 0, 
    "[email protected]": null, 
    "start": "0.00", 
    "end": "0.00", 
    "lapCount": 0, 
    "duration": null 
    } 

किसी को भी पता है क्यों कि ऐसा हो सकता है? डेटा सही है, "@" प्रतीक वाले फ़ील्ड का डुप्लिकेशन मुद्दा है।

उत्तर

6

जिस तरह से आपने अपना रिकॉर्ड परिभाषित किया है वह यहां अपराधी है। रिकॉर्ड फ़ील्ड गुणों के रूप में उजागर होते हैं - लेकिन आप उत्परिवर्तनीय गुणों का उपयोग कर रहे हैं। एफ # उस वर्ग में बदल जाएगा जिसमें आपके प्रत्येक उत्परिवर्तन के लिए फ़ील्ड्स हैं (नाम संपत्ति का नाम है, @ के साथ prefixed है), और उन गुणों को पढ़ते हैं जो उनको पढ़ते हैं।

जेसन अब सभी क्षेत्रों और सभी गुणों को क्रमबद्ध करने का प्रयास करेगा - इसलिए आपको डुप्लिकेशन मिल जाएगा।

एफ # इंटरैक्टिव में इसे आजमाएं:

type SplitTracker = 
    { 
     mutable start : float 
    } 
let t = typeof<SplitTracker> 
let fields1 = t.GetFields() // This will give you a field '@start' 
let props1 = t.GetProperties() // This will give you a property 'start' 

कंट्रास्ट उस के साथ आप क्या जब एक सादे रिकॉर्ड का उपयोग कर पाने:

type SplitTracker2 = 
    { 
     start : float 
    } 
let t2 = typeof<SplitTracker2> 
let fields2 = t2.GetFields() // You will not see any fields 
let props2 = t2.GetProperties() // There is a single property 'start' 

यह सही ढंग से क्रमानुसार चाहिए। इसके अलावा, यह आपके कोड को अधिक मूर्खतापूर्ण बनाता है।

+0

धन्यवाद, ऐसा लगता है कि मैं इसे एक कस्टम कनवर्टर के साथ ठीक कर सकता हूं, या शायद अगर मैं इस एल्गोरिदम को विस्थापन चर के बिना समझ सकता हूं – jackmott

+3

आप अपने mutable फ़ील्ड पर '[]' का उपयोग कर सकते हैं ताकि फ़ील्ड अनदेखा किया जाता है। – Tarmil

+0

@ जैकमॉट: मैं शर्त लगाता हूं कि उत्परिवर्तन पर भरोसा न करने के लिए आपके एल्गोरिदम को फिर से सोचने का एक तरीका है। यदि संदेह है, तो यहां पोस्ट करें। –

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