2012-08-01 10 views
6

मैं एक मौजूदा JSON एपीआई को एक हैकी एमवीसी 3 कार्यान्वयन से नवीनतम एमवीसी 4 वेब एपीआई में परिवर्तित करने के लिए देख रहा हूं। एमवीसी 3 कार्यान्वयन JSON.NET का उपयोग सभी धारावाहिक करने के लिए करता है जो अपग्रेड को अच्छी और चिकनी बना देगा।एएसपी वेब एपीआई जेसन सीरियलाइजेशन को अनुकूलित करना जिसके द्वारा एक्शन लागू किया गया है

मैं कुछ क्रियाओं के परिणामों को क्रमबद्ध करने के तरीके को अनुकूलित करने पर अटक गया हूं। उदाहरण के लिए, मैं कुछ क्रियाओं को आउटपुट ऑब्जेक्ट्स के केवल कुछ गुणों को वापस लौटना चाहता हूं, जबकि अन्य लोग गहरे क्रमबद्धीकरण कर सकते हैं। मेरे वर्तमान कार्यान्वयन में, एक क्रिया HttpContext में उपयुक्त सेटिंग्स सेट करके धारावाहिक ओवरराइड का एक गुच्छा जोड़ सकती है। बाद में JsonResult से प्राप्त कक्षा के माध्यम से कस्टम क्रमिकरण के लिए इसे उठाया जाता है। कस्टम JsonConverters जोड़ने का मुख्य उपयोग धारावाहिक प्राप्त करने वाली कुंजी/मानों की संख्या को नियंत्रित और कम करना है, और कार्रवाई के आधार पर क्रमबद्ध करने के लिए पैरामीटर को बदलना है (कुछ क्रियाओं को दूसरों की तुलना में अधिक ऑब्जेक्ट पैरामीटर वापस करना चाहिए)।

एक नियंत्रक और वर्ग मेरे वर्तमान MVC3 कार्यान्वयन में नियंत्रित json क्रमबद्धता की संघनित उदाहरण:

public class TestController : JsonController { 
    public JsonResult Persons() { 
     ControllerContext.HttpContext.Items[typeof(IEnumerable<JsonConverter>)] = new JsonConverter[] { 
      new InterfaceExtractorJsonConverter<IPersonForList>(), 
      new StringEnumConverter() 
     }; 

     ControllerContext.HttpContext.Items[typeof(IContractResolver)] = new SpecialCamelCasePropertyNamesContractResolver(); 
    } 
} 

public class JsonNetResult : JsonResult { 
    public override void ExecuteResult(ControllerContext context) { 
     var response = context.HttpContext.Response; 

     var additionalConverters = context.HttpContext.Items[typeof(IEnumerable<JsonConverter>)] as IEnumerable<JsonConverter> ?? Enumerable.Empty<JsonConverter>(); 

     var contractResolver = context.HttpContext.Items[typeof(IContractResolver)] as IContractResolver ?? new JsonContractResolver(); 

     var typeNameHandling = TypeNameHandling.None; 
     if (context.HttpContext.Items.Contains(typeof(TypeNameHandling))) 
      typeNameHandling = (TypeNameHandling)context.HttpContext.Items[typeof(TypeNameHandling)]; 

     response.Write(JsonConvert.SerializeObject(Data, Formatting.Indented, new JsonSerializerSettings { 
      ContractResolver = contractResolver, 
      ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
      Converters = additionalConverters, 
      TypeNameHandling = typeNameHandling 
     })); 
    } 
} 

वेब एपीआई में मुझे लगता है कि मैं विन्यास से Json फ़ॉर्मेटर हो और विश्व स्तर पर serializations को बदल सकते हैं ।

var config = new HttpSelfHostConfiguration("http://localhost:8080"); 

var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().Single(); 

jsonFormatter.SerializerSettings.ContractResolver = new SpecialCamelCasePropertyNamesContractResolver(); 
jsonFormatter.SerializerSettings.Converters = new[] { new InterfaceExtractorJsonConverter<ITesting>() }; 

हालांकि, मैं जो JsonConverter's उपयोग करने के लिए निर्दिष्ट करने के लिए कुछ विशेषताओं को जोड़कर एक व्यक्तिगत आधार (या प्रति नियंत्रक) पर कार्रवाई की क्रमबद्धता को नियंत्रित करने पर योजना बना रहा था। इस प्रकार मैं जेसन सीरियलाइजर को आवंटित क्रिया/नियंत्रक को दिए गए प्रासंगिक विशेषताओं को ढूंढना चाहता हूं और तदनुसार क्रमबद्धता को बदलना चाहता हूं। मुझे यकीन नहीं है कि यह कहां और कैसे करें। क्या मुझे JsonMediaTypeFormatter से उत्तराधिकारी होना चाहिए और किसी भी तरह से काम करना चाहिए? मेरे पास अन्य विकल्प क्या हैं?

उत्तर

2

मैंने कभी भी किसी को इस तरह से क्रमबद्धता को नियंत्रित नहीं करना देखा है। लेकिन rework की कम से कम राशि के साथ अपने लक्ष्य को प्राप्त करने, मैं सीधे अपने विधि से कि जानकारी के सभी वापसी होगी:

class JsonNetFormatter : MediaTypeFormatter { 
    public override bool CanWriteType(Type t) { 
     return typeof(JsonNetResponse).IsAssignableFrom(t); 
    } 
    // TODO WriteToStreamAsync which is basically a copy of your original JsonNetResult 
} 
:

class JsonNetResponse { 
    public IContractResolver ContractResolver { get;set; } 
    // Other Json.Net bits 
    public object Value { get; set; } 
} 

से उन वस्तुओं को संभाल सकता है मैं तो एक कस्टम फ़ॉर्मेटर बन जाएगा

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