2012-09-08 15 views
74

जब मैं क्रमानुसार निम्नलिखित:नेट वेबएपीआई क्रमबद्धता k_BackingField nastiness

<ErrorRootOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Printmee.Api"> 
<_x003C_Errors_x003E_k__BackingField> 
An exception has occurred. Please contact printmee support 
</_x003C_Errors_x003E_k__BackingField> 
<_x003C_LookupCode_x003E_k__BackingField>988232ec-6bc9-48f3-8116-7ff7c71302dd</_x003C_LookupCode_x003E_k__BackingField> 
</ErrorRootOfstring> 

क्या देता है:

[Serializable] 
public class Error 
{ 

    public string Status { get; set; } 
    public string Message { get; set; } 
    public string ErrorReferenceCode { get; set; } 
    public List<FriendlyError> Errors { get; set; } 
} 

मैं इस घृणित गंदगी मिल सकता है? मैं यह सुंदर कैसे बना सकता हूं? JSON प्रतिक्रियाओं में k_BackingField

+0

इससे मेरी मदद मिली: http://stackoverflow.com/questions/15388452/access-the-default-json-net-serializer-in-asp-net-web-api – granadaCoder

उत्तर

109

डिफ़ॉल्ट रूप से आपको वेब API के साथ काम करने के लिए [Serializable] और न ही [DataContract] का उपयोग करने की आवश्यकता नहीं है।

बस अपना मॉडल छोड़ दें, और वेब एपीआई आपके लिए सभी सार्वजनिक संपत्तियों को क्रमबद्ध करेगी।

सिर्फ अगर आप क्या शामिल है के बारे में अधिक नियंत्रण चाहते हैं, तो आप [DataContract] के साथ अपने वर्ग सजाने और गुण [DataMember] (इन विशेषताओं क्योंकि दोनों DCS और JSON.NET respsect) के साथ शामिल किया जाना है।

यदि किसी कारण से, आपको अपनी कक्षा पर [Serializable] की आवश्यकता है (यानी आप इसे किसी कारण से स्मृति धारा में क्रमबद्ध कर रहे हैं, गहरी प्रतियां आदि कर रहे हैं), तो आपको बैकिंग फ़ील्ड को रोकने के लिए दोनों गुणों का उपयोग करना होगा नाम:

[Serializable] 
[DataContract] 
public class Error 
{ 
    [DataMember] 
    public string Status { get; set; } 
    [DataMember] 
    public string Message { get; set; } 
    [DataMember] 
    public string ErrorReferenceCode { get; set; } 
    [DataMember] 
    public List<FriendlyError> Errors { get; set; } 
} 
+6

वह था - मुझे बस इसकी आवश्यकता थी [Serializable] को हटा दें। धन्यवाद। – Micah

+0

धन्यवाद फिलिप, कैश के कारण गुणों को रखना है .. बीटीडब्ल्यू, मैं आपके ब्लॉग का उत्साही प्रशंसक हूं .. इसे आना जारी रखें! –

+0

हाहा बहुत बहुत धन्यवाद! –

2

आपकी कक्षा को चिह्नित करने के लिए Serializable के बजाय DataContract का उपयोग करने का प्रयास करें। इस बारे में अधिक जानकारी के लिए, इस good blog post on serializing automatic properties.

79

वहाँ एक अधिक सामान्य समाधान है: आप तो यह है कि आप अपनी कक्षाओं में विशेषताओं को बदलने के लिए नहीं है, [Serializable] विशेषता की अनदेखी करने के Json Serializer कॉन्फ़िगर कर सकते हैं।

आप Global.asax Application_Start में आवेदन शुरू में इस विन्यास परिवर्तन, यानी बनाना चाहिए घटना:

var serializerSettings = 
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings; 
var contractResolver = 
    (DefaultContractResolver)serializerSettings.ContractResolver; 
contractResolver.IgnoreSerializableAttribute = true; 

तुम भी दिनांकों serializing के लिए स्वरूपों का उल्लेख करने वाले, Json क्रमबद्धता को अन्य परिवर्तन कर सकते हैं, और कई अन्य बातें।

यह केवल वेब एपीआई जेएसओएन क्रमबद्धता पर लागू होगा। ऐप में अन्य serializations (वेब ​​एपीआई एक्सएमएल serialization, एमवीसी JsonResult ...) इस सेटिंग से प्रभावित नहीं होगा।

+2

इस समाधान ने मेरी मदद की ... दो बार! और मैं इसे बीच में भूल गया था। –

+2

मुझे यह समाधान हर जगह [DataContract] और [DataMember] विशेषताएँ जोड़ने से बहुत बेहतर लगता है। धन्यवाद!! –

+0

बहुत बढ़िया, एक आकर्षण की तरह काम करता है! – Roemer