2012-12-19 12 views
5

मान लीजिए मैं एक मॉडल हैकैसे इंटरफेस के रूप में मॉडल संपत्ति के साथ ASP.NET वेब एपीआई में पोस्ट करने के

public class NextStepCommand : IMenuCommand 
{ 
    public int Step { get; set; } 
} 

public class VoiceCommand : IMenuCommand 
{ 
    public string Message { get; set; } 
} 

और मैं पोस्ट करना चाहते हैं एएसपी.NET वेब एपीआई सेवा के लिए विभिन्न आदेशों के साथ मेनू। मैं उसे कैसे कर सकता हूँ?

अनुरोध नीचे निर्दिष्ट Name के साथ एक वस्तु निर्माण करेंगे, लेकिन Next आदेश अशक्त हो जाएगा:

POST http://localhost/api/menus: {"name":"bob","next":{"step":1}} 
Returns 201: {"Name":"bob","Next":null} 

डिफ़ॉल्ट वेब एपीआई बाइंडरों की जरूरत सी # प्रकार के मेरे अनुरोध पैरामीटर मैप नहीं कर सकते हैं - निश्चित रूप से यह एक है मुश्किल हिस्सा क्या मैं इंटरफ़ेस-आधारित गुणों के लिए कुछ "ज्ञात-प्रकार" विशेषता का उपयोग कर सकता हूं या क्या इस मामले को संभालने के लिए कोई अन्य दृष्टिकोण है, शायद एक कस्टम मॉडल बाइंडर?

उत्तर

5

मुझे लगता है कि आप जो खोज रहे हैं वह है जो नाम नाम हैंडलिंग के लिए जेसन.NET का समर्थन है। यह आपको "$ प्रकार" जेसन टैग जोड़कर deserialize करने के लिए प्रकार निर्दिष्ट करने की अनुमति देता है। आप यह कैसे काम करता है देखने के लिए बाहर इस कोड की कोशिश कर सकते हैं:

Console.WriteLine(JsonConvert.DeserializeObject<Menu>(
    @"{ 
     ""name"":""bob"", 
     ""next"": 
     { 
      ""$type"" : ""ConsoleApplication.NextStepCommand,ConsoleApplication"", 
      ""step"" : 1 
     } 
    }", 
    new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Auto }).Next); 

आप नाम स्थान बदल सकते हैं और विधानसभा अपने स्वयं के साथ नाम के लिए होगा, लेकिन आप NextStepCommand सही ढंग से deserialized होती दिखाई देगी।

वेबएपीआई में, आप "$ प्रकार" प्रकार की जानकारी जोड़ने का निवेदन tweak करने की आवश्यकता होगी, और आप इस तरह TypeNameHandling को सक्षम करना होगा: जब मैं `TypeNameHandling सेट

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; 
+0

मेरे लिए काम किया वेब एपीआई JSON serializer के लिए .uto 'और एक कमांड के आवश्यक "$ प्रकार" के साथ एक अनुरोध भेजा। लेकिन क्या मैं केवल deserialization के लिए 'TypeNameHandling' सुविधा चालू कर सकता हूं? क्योंकि अब जीईटी सेवाओं में जेएसओएन आउटपुट में मेरे पास बहुत अधिक कचरा है। – whyleee

+6

मिला है कि यह उपयोग करने के लिए '[JsonProperty (TypeNameHandling = TypeNameHandling.All)]' विशिष्ट मॉडल संपत्तियों के लिए (से [Json.NET ब्लॉग] (http://james.newtonking.com/archive/2010/08/13/ संभव है json निवल 3-5 रिलीज-8-3-5-final.aspx))। वेब एपीआई के साथ जांच - यह काम करता है। अब काफ़ी बेहतर। – whyleee

+0

@Youssef मुसावयी - इस प्रश्न पर कोई भी विचार: http://stackoverflow.com/questions/20252027/json-net-web-api-serialization-with-derrived-inherited-types ... कुछ भी साथ किसी भी भाग्य के न होने का! – amcdnl

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