2013-02-23 38 views
26

मैं अपनी कार्रवाई को जेसनआरसल्ट लौटने की कोशिश कर रहा हूं जहां इसकी सभी संपत्ति ऊंट में हैं।एमवीसी जेसनआरसल्ट ऊंटकेस सीरियलाइजेशन

public class MyModel 
{ 
    public int SomeInteger { get; set; } 

    public string SomeString { get; set; } 
} 

और एक सरल नियंत्रक कार्रवाई:

public JsonResult Index() 
    { 
     MyModel model = new MyModel(); 
     model.SomeInteger = 1; 
     model.SomeString = "SomeString"; 

     return Json(model, JsonRequestBehavior.AllowGet); 
    } 

कॉलिंग इस कार्रवाई विधि अब एक JsonResult निम्न डेटा युक्त रिटर्न:

{"SomeInteger":1,"SomeString":"SomeString"} 

मैं एक बस मॉडल है मेरे उपयोग के लिए मुझे कार्रवाई को कैमेलकेस में डेटा वापस करने की आवश्यकता है, किसी भी तरह यह:

{"someInteger":1,"someString":"SomeString"} 

क्या ऐसा करने का कोई शानदार तरीका है?

मैं यहां के आसपास के संभावित समाधानों को देख रहा था और MVC3 JSON Serialization: How to control the property names? पाया जहां उन्होंने मॉडल की हर संपत्ति के लिए डेटामेम्बर परिभाषाएं सेट कीं, लेकिन मैं वास्तव में ऐसा नहीं करना चाहता हूं।

इसके अलावा मुझे एक लिंक मिला जहां वे कहते हैं कि इस तरह के मुद्दे को हल करना संभव है: http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#json_camelcasing। इसे कहते हैं:

ऊंट आवरण के साथ JSON संपत्ति के नाम लिखने के लिए, अपने डेटा मॉडल को परिवर्तित किए बिना, serializer पर CamelCasePropertyNamesContractResolver सेट: इस ब्लॉग http://frankapi.wordpress.com/2012/09/09/going-camelcase-in-asp-net-mvc-web-api/ पर

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

एक प्रविष्टि भी इस समाधान और राज्यों mentiones आप इस समस्या को ठीक करने के लिए इसे आसानी से RouteConfig.RegisterRoutes पर जोड़ सकते हैं। मैंने कोशिश की, लेकिन मैं इसे काम नहीं कर सका।

क्या आपके पास कोई विचार है कि मैं कुछ गलत कर रहा था?

+0

"मैंने कोशिश की, लेकिन मैं इसे काम नहीं कर सका" का क्या अर्थ है। – nemesv

+0

मैंने उस कोड स्निपेट को रूटकोनफिग.रेजिस्टर रूट्स विधि में जोड़ा लेकिन ऐसा कोई प्रभाव नहीं पड़ा क्योंकि जेसनआरसल्ट में अभी भी वही डेटा था। –

+2

एफवाईआई, 'कैमेलकेसप्रॉपर्टी नामकंट्रैक्ट रिसेल्वर' केवल वेबएपीआई नियंत्रकों के साथ काम करता है (नियंत्रक जो 'एपीकंट्रोलर' का विस्तार करते हैं)। – danludwig

उत्तर

11

नियंत्रक के Json कार्यों सिर्फ बनाने JsonResults के लिए रैपर हैं:

protected internal JsonResult Json(object data) 
{ 
    return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet); 
} 

protected internal JsonResult Json(object data, string contentType) 
{ 
    return Json(data, contentType, null /* contentEncoding */, JsonRequestBehavior.DenyGet); 
} 

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding) 
{ 
    return Json(data, contentType, contentEncoding, JsonRequestBehavior.DenyGet); 
} 

protected internal JsonResult Json(object data, JsonRequestBehavior behavior) 
{ 
    return Json(data, null /* contentType */, null /* contentEncoding */, behavior); 
} 

protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior) 
{ 
    return Json(data, contentType, null /* contentEncoding */, behavior); 
} 

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior) 
{ 
    return new JsonResult 
    { 
     Data = data, 
     ContentType = contentType, 
     ContentEncoding = contentEncoding, 
     JsonRequestBehavior = behavior 
    }; 
} 

JsonResult आंतरिक JavaScriptSerializer का उपयोग करता है, तो आप क्रमबद्धता प्रक्रिया के बारे में नियंत्रण नहीं है:

public class JsonResult : ActionResult 
{ 
    public JsonResult() 
    { 
     JsonRequestBehavior = JsonRequestBehavior.DenyGet; 
    } 

    public Encoding ContentEncoding { get; set; } 

    public string ContentType { get; set; } 

    public object Data { get; set; } 

    public JsonRequestBehavior JsonRequestBehavior { get; set; } 

    /// <summary> 
    /// When set MaxJsonLength passed to the JavaScriptSerializer. 
    /// </summary> 
    public int? MaxJsonLength { get; set; } 

    /// <summary> 
    /// When set RecursionLimit passed to the JavaScriptSerializer. 
    /// </summary> 
    public int? RecursionLimit { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 
     if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && 
      String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) 
     { 
      throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed); 
     } 

     HttpResponseBase response = context.HttpContext.Response; 

     if (!String.IsNullOrEmpty(ContentType)) 
     { 
      response.ContentType = ContentType; 
     } 
     else 
     { 
      response.ContentType = "application/json"; 
     } 
     if (ContentEncoding != null) 
     { 
      response.ContentEncoding = ContentEncoding; 
     } 
     if (Data != null) 
     { 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      if (MaxJsonLength.HasValue) 
      { 
       serializer.MaxJsonLength = MaxJsonLength.Value; 
      } 
      if (RecursionLimit.HasValue) 
      { 
       serializer.RecursionLimit = RecursionLimit.Value; 
      } 
      response.Write(serializer.Serialize(Data)); 
     } 
    } 
} 

आपके पास अपना खुद का जेसन रीसेट बनाने और अपने स्वयं के जेसन कंट्रोलर फ़ंक्शन लिखने के लिए (यदि आपको इसकी आवश्यकता है/चाहते हैं)। आप नए बना सकते हैं या मौजूदा लोगों को ओवरराइट कर सकते हैं, यह आपके ऊपर है। यह link आपको भी रूचि दे सकता है।

13

यदि आप अपनी कार्रवाई से एक जेसन स्ट्रिंग वापस करना चाहते हैं जो कैमेलकेस नोटेशन का पालन करता है तो आपको जेसनएसरियललाइज़र सेटिंग उदाहरण बनाना है और इसे जेसनकॉन्टर.रियललाइज ऑब्जेक्ट (ए, बी) विधि के दूसरे पैरामीटर के रूप में पास करना है।

public string GetSerializedCourseVms() 
    { 
     var courses = new[] 
     { 
      new CourseVm{Number = "CREA101", Name = "Care of Magical Creatures", Instructor ="Rubeus Hagrid"}, 
      new CourseVm{Number = "DARK502", Name = "Defence against dark arts", Instructor ="Severus Snape"}, 
      new CourseVm{Number = "TRAN201", Name = "Transfiguration", Instructor ="Minerva McGonal"} 
     }; 
     var camelCaseFormatter = new JsonSerializerSettings(); 
     camelCaseFormatter.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
     return JsonConvert.SerializeObject(courses, camelCaseFormatter); 
    }