ASP.NET MVC में Json () से फोर्स लोअरकेस संपत्ति के नाम


89

निम्न वर्ग को देखते हुए,

public class Result
{      
    public bool Success { get; set; }

    public string Message { get; set; }
}

मैं इनमें से एक को इस तरह नियंत्रक कार्रवाई में वापस कर रहा हूं,

return Json(new Result() { Success = true, Message = "test"})

हालाँकि मेरा क्लाइंट साइड फ्रेमवर्क इन संपत्तियों को सफलता और संदेश को कम करने की उम्मीद करता है। वास्तव में संपत्ति के नाम कम होने के बिना यह एक तरीका है कि सामान्य जोंस फ़ंक्शन कॉल को सोचा जाए?

जवाबों:


130

इसे प्राप्त करने का तरीका JsonResultयहां एक रिवाज को लागू करना है: एक कस्टम वैल्यू टाइप बनाना और एक कस्टम JsonResult (मूल लिंक मृत) के साथ सीरियल बनाना

और JSON.NET जैसे वैकल्पिक धारावाहिक का उपयोग करें , जो इस प्रकार के व्यवहार का समर्थन करता है, जैसे:

Product product = new Product
{
  ExpiryDate = new DateTime(2010, 12, 20, 18, 1, 0, DateTimeKind.Utc),
  Name = "Widget",
  Price = 9.99m,
  Sizes = new[] {"Small", "Medium", "Large"}
};

string json = 
  JsonConvert.SerializeObject(
    product,
    Formatting.Indented,
    new JsonSerializerSettings 
    { 
      ContractResolver = new CamelCasePropertyNamesContractResolver() 
    }
);

का परिणाम

{
  "name": "Widget",
  "expiryDate": "\/Date(1292868060000)\/",
  "price": 9.99,
  "sizes": [
    "Small",
    "Medium",
    "Large"
  ]
}


यदि आप JSON.NET का उपयोग कर रहे हैं, और ऊंट नहीं बल्कि स्नेक_केस चाहते हैं, तो इस जिस्ट की जांच करें, वास्तव में मेरी मदद की! gist.github.com/crallen/9238178
Niclas Lindqvist

मैं किस तरह से डिसेरिअलाइज़ कर सकता हूं? पूर्व। से "छोटा" के लिए "छोटे"
किश्ती

1
@NiclasLindqvist आधुनिक JSON.NET संस्करणों के लिए, स्नेक_केस प्राप्त करने का एक बहुत ही सरल तरीका है: newtonsoft.com/json/help/html/NamingStrategySnakeCase.htm
Søren Boisen

17

यदि आप वेब एपीआई का उपयोग कर रहे हैं तो धारावाहिक बदलना सरल है, लेकिन दुर्भाग्यवश MVC स्वयं JavaScriptSerializerको JSON.Net का उपयोग करने के लिए इसे बदलने के लिए कोई विकल्प नहीं देता है।

जेम्स का जवाब और डैनियल का जवाब आपको JSON.Net का लचीलापन देता है लेकिन इसका मतलब यह है कि हर जगह जहां आप सामान्य रूप से करते हैं, return Json(obj)आपको return new JsonNetResult(obj)उसी तरह बदलना होगा या अगर आपके पास एक बड़ा प्रोजेक्ट है तो यह एक समस्या साबित हो सकती है, और यह भी बहुत लचीला नहीं है अगर आप जिस धारावाहिक का उपयोग करना चाहते हैं, उस पर अपना विचार बदल दें।


मैंने ActionFilterमार्ग नीचे जाने का निर्णय लिया है । नीचे दिया गया कोड आपको किसी भी कार्रवाई का उपयोग करने की अनुमति देता है JsonResultऔर केवल JSON.Net (निचले मामले के गुणों के साथ) का उपयोग करने के लिए उस पर एक विशेषता लागू करता है:

[JsonNetFilter]
[HttpPost]
public ActionResult SomeJson()
{
    return Json(new { Hello = "world" });
}

// outputs: { "hello": "world" }

आप इसे स्वचालित रूप से सभी कार्यों पर लागू कर सकते हैं (केवल isचेक के मामूली प्रदर्शन के साथ ):

FilterConfig.cs

// ...
filters.Add(new JsonNetFilterAttribute());

कोड

public class JsonNetFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is JsonResult == false)
            return;

        filterContext.Result = new CustomJsonResult((JsonResult)filterContext.Result);
    }

    private class CustomJsonResult : JsonResult
    {
        public CustomJsonResult(JsonResult jsonResult)
        {
            this.ContentEncoding = jsonResult.ContentEncoding;
            this.ContentType = jsonResult.ContentType;
            this.Data = jsonResult.Data;
            this.JsonRequestBehavior = jsonResult.JsonRequestBehavior;
            this.MaxJsonLength = jsonResult.MaxJsonLength;
            this.RecursionLimit = jsonResult.RecursionLimit;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
                throw new ArgumentNullException("context");

            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet
                && String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
                throw new InvalidOperationException("GET not allowed! Change JsonRequestBehavior to AllowGet.");

            var response = context.HttpContext.Response;

            response.ContentType = String.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;

            if (this.ContentEncoding != null)
                response.ContentEncoding = this.ContentEncoding;

            if (this.Data != null)
            {
                var json = JsonConvert.SerializeObject(
                    this.Data,
                    new JsonSerializerSettings
                        {
                            ContractResolver = new CamelCasePropertyNamesContractResolver()
                        });

                response.Write(json);
            }
        }
    }
}

10

मेरे समाधान के साथ, आप अपनी इच्छित प्रत्येक संपत्ति का नाम बदल सकते हैं।

मैंने समाधान का एक हिस्सा यहां और एसओ पर पाया है

public class JsonNetResult : ActionResult
    {
        public Encoding ContentEncoding { get; set; }
        public string ContentType { get; set; }
        public object Data { get; set; }

        public JsonSerializerSettings SerializerSettings { get; set; }
        public Formatting Formatting { get; set; }

        public JsonNetResult(object data, Formatting formatting)
            : this(data)
        {
            Formatting = formatting;
        }

        public JsonNetResult(object data):this()
        {
            Data = data;
        }

        public JsonNetResult()
        {
            Formatting = Formatting.None;
            SerializerSettings = new JsonSerializerSettings();
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
                throw new ArgumentNullException("context");
            var response = context.HttpContext.Response;
            response.ContentType = !string.IsNullOrEmpty(ContentType)
              ? ContentType
              : "application/json";
            if (ContentEncoding != null)
                response.ContentEncoding = ContentEncoding;

            if (Data == null) return;

            var writer = new JsonTextWriter(response.Output) { Formatting = Formatting };
            var serializer = JsonSerializer.Create(SerializerSettings);
            serializer.Serialize(writer, Data);
            writer.Flush();
        }
    }

ताकि मेरे नियंत्रक में, मैं ऐसा कर सकूं

        return new JsonNetResult(result);

मेरे मॉडल में, अब मैं कर सकता हूँ:

    [JsonProperty(PropertyName = "n")]
    public string Name { get; set; }

ध्यान दें कि अब, आपको JsonPropertyAttributeहर उस संपत्ति को सेट करना होगा जिसे आप क्रमबद्ध करना चाहते हैं।


1

हालांकि यह एक पुराना सवाल है, आशा है कि नीचे कोड स्निपेट दूसरों के लिए उपयोगी होगा,

मैंने MVC5 वेब एपीआई के साथ नीचे किया।

public JsonResult<Response> Post(Request request)
    {
        var response = new Response();

        //YOUR LOGIC IN THE METHOD
        //.......
        //.......

        return Json<Response>(response, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() });
    }

0

आप इस सेटिंग को इसमें जोड़ सकते हैं Global.asax, और यह हर जगह काम करेगा।

public class Global : HttpApplication
{   
    void Application_Start(object sender, EventArgs e)
    {
        //....
         JsonConvert.DefaultSettings = () =>
         {
             var settings = new JsonSerializerSettings
             {
                 ContractResolver = new CamelCasePropertyNamesContractResolver(),
                 PreserveReferencesHandling = PreserveReferencesHandling.None,
                 Formatting = Formatting.None
             };

             return settings;
         }; 
         //....
     }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.