मैं ASP.NET MVC नियंत्रक विधियों से JSON.NET द्वारा क्रमबद्ध कैमलकेस JSON कैसे लौटा सकता हूं?


246

मेरी समस्या यह है कि मैं ASP.NET MVC कंट्रोलर विधियों, JSON.NET द्वारा धारावाहिक से ActionResult s के माध्यम से कैमल कैस्ड (मानक PascalCase के विपरीत) JSON डेटा वापस करना चाहता हूं

एक उदाहरण के रूप में निम्नलिखित C # वर्ग पर विचार करें:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

डिफ़ॉल्ट रूप से, जब JSON के रूप में MVC नियंत्रक से इस वर्ग का एक उदाहरण लौटाया जाता है, तो इसे निम्नलिखित फैशन में क्रमबद्ध किया जाएगा:

{
  "FirstName": "Joe",
  "LastName": "Public"
}

मैं इसे (JSON.NET द्वारा) क्रमबद्ध करना चाहूंगा:

{
  "firstName": "Joe",
  "lastName": "Public"
}

मैं यह कैसे करु?

जवाबों:


389

या, सीधे शब्दों में कहें:

JsonConvert.SerializeObject(
    <YOUR OBJECT>, 
    new JsonSerializerSettings 
    { 
        ContractResolver = new CamelCasePropertyNamesContractResolver() 
    });

उदाहरण के लिए:

return new ContentResult
{
    ContentType = "application/json",
    Content = JsonConvert.SerializeObject(new { content = result, rows = dto }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }),
    ContentEncoding = Encoding.UTF8
};

2
यह हालांकि उपयोग करने के लिए अधिक जटिल है, क्योंकि आपको प्रत्येक नियंत्रक विधि के लिए ContentResult को कॉन्फ़िगर करना होगा।
aknuds1

2
हाँ, मैं समझता हूँ कि आपका उत्तर एक पुन: प्रयोज्य समाधान था, मेरा कहना यह है कि इसे और अधिक स्पष्ट किया जाए कि यह केवल सीरमेट विधि पर एक पैरामीटर है।
वेबडेवर

1
यदि आप JSON को किसी Controllerविधि से लौटा रहे हैं , तो संभवतः आपको इसका उपयोग करना चाहिए ApiController, जिस स्थिति में यह उत्तर बहुत अच्छा है।
साइमन हार्टर

1
@SimonHartcher प्रश्न के दायरे पर विचार करें, हालांकि सामान्य मामला नहीं।
एकन्यूड्स 1

1
JSON के लिए मान्य सामग्री-प्रकार है application/json, नहीं text/plain
फ्रेड

94

मुझे मैट्स कार्लसन के ब्लॉग पर इस समस्या का एक उत्कृष्ट समाधान मिला । समाधान ActionResult का एक उपवर्ग लिखने के लिए है जो JSON.NET के माध्यम से डेटा को क्रमबद्ध करता है, जो कैमलस सम्मेलन का पालन करने के लिए बाद को कॉन्फ़िगर करता है:

public class JsonCamelCaseResult : ActionResult
{
    public JsonCamelCaseResult(object data, JsonRequestBehavior jsonRequestBehavior)
    {
        Data = data;
        JsonRequestBehavior = jsonRequestBehavior;
    }

    public Encoding ContentEncoding { get; set; }

    public string ContentType { get; set; }

    public object Data { get; set; }

    public JsonRequestBehavior JsonRequestBehavior { 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("This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.");
        }

        var response = context.HttpContext.Response;

        response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data == null)
            return;

        var jsonSerializerSettings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        response.Write(JsonConvert.SerializeObject(Data, jsonSerializerSettings));
    }
}

फिर अपने MVC नियंत्रक विधि में निम्नानुसार इस वर्ग का उपयोग करें:

public ActionResult GetPerson()
{
    return new JsonCamelCaseResult(new Person { FirstName = "Joe", LastName = "Public" }, JsonRequestBehavior.AllowGet)};
}

3
सही जवाब: साफ और पुन: प्रयोज्य! धन्यवाद।
सेंडर

1
जबकि यह समाधान अभी भी काम कर रहा है। लेकिन यह 4 साल पहले सुझाया गया था। क्या हमारे पास एक बेहतर उपाय है?
शार्पकोड

59

के लिए वेबएपीआई :, इस लिंक की जाँच http://odetocode.com/blogs/scott/archive/2013/03/25/asp-net-webapi-tip-3-camelcasing-json.aspx

मूल रूप से, इस कोड को अपने में जोड़ें Application_Start:

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();

4
Web API और MVC को ASP.NET 6 में
AlexFoxGill

1
सुविधा के लिए लिंकिंग; यह सेटअप वास्तव में इस उत्तर के साथ अच्छी तरह से निभाता है: stackoverflow.com/a/26068063/398630 (विभिन्न प्रश्न, लेकिन मैं उन्हें एक साथ उपयोग करता हूं, और यह लिंक मुझे और अन्य लोगों को भविष्य में कुछ googling बचा सकता है)।
BrainSlugs83

37

मुझे लगता है कि यह वह सरल उत्तर है जिसकी आपको तलाश है। यह शॉन वाइल्डरमथ के ब्लॉग से है:

// Add MVC services to the services container.
services.AddMvc()
  .AddJsonOptions(opts =>
  {
    opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
  });

2
मेरी क्षमायाचना, दोस्तों। मैं इस पोस्ट के माध्यम से बहुत जल्दी पढ़ता हूं। यह ASP.NET 5. के लिए है
क्वांटियम

8
विडंबना यह है कि मैं यहां आपके द्वारा पूछे गए प्रश्न का उत्तर ढूंढने के लिए आया हूं, इसलिए जब तक यह ओपी के प्रश्न का उत्तर नहीं था, तब भी इससे मदद मिली। धन्यवाद! :)
पोर्कस

1
मैंने दूसरा जो @porcus कहा है! धन्यवाद @Quantium!
ग्रोमर

4
ASP.NET Core 1.0 के लिए fyi डिफ़ॉल्ट रूप से ऊंट का मामला है
क्रिस मैरिसिक

3
यह पता चलता है कि यह (बिल्कुल) .NET कोर 1.0 के लिए डिफ़ॉल्ट नहीं है। यह समाधान गतिशील गुणों को प्रभावित करता है और वे डिफ़ॉल्ट रूप से प्रभावित नहीं होते हैं। stackoverflow.com/questions/41329279/…
नील्स ब्रिंच

13

कस्टम फ़िल्टर का एक विकल्प JSON के लिए किसी भी वस्तु को क्रमबद्ध करने के लिए एक विस्तार विधि बनाना है।

public static class ObjectExtensions
{
    /// <summary>Serializes the object to a JSON string.</summary>
    /// <returns>A JSON string representation of the object.</returns>
    public static string ToJson(this object value)
    {
        var settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Converters = new List<JsonConverter> { new StringEnumConverter() }
        };

        return JsonConvert.SerializeObject(value, settings);
    }
}

फिर नियंत्रक क्रिया से लौटते समय इसे कॉल करें।

return Content(person.ToJson(), "application/json");

सुरुचिपूर्ण और सरल।
markau

1
आप सेटिंग को स्थैतिक रूप से आसानी से फ़ील्ड में स्थानांतरित कर सकते हैं और एक FromJson पूरक विधि जोड़ सकते हैं।
गली में

8

सरल है बेहतर IMO!

आप ऐसा क्यों नहीं करते?

public class CourseController : JsonController
{
    public ActionResult ManageCoursesModel()
    {
        return JsonContent(<somedata>);
    }
}

सरल आधार वर्ग नियंत्रक

public class JsonController : BaseController
{
    protected ContentResult JsonContent(Object data)
    {
        return new ContentResult
        {
            ContentType = "application/json",
             Content = JsonConvert.SerializeObject(data, new JsonSerializerSettings { 
              ContractResolver = new CamelCasePropertyNamesContractResolver() }),
            ContentEncoding = Encoding.UTF8
        };
    }
}

7

ASP.NET Core MVC में।

    public IActionResult Foo()
    {
        var data = GetData();

        var settings = new JsonSerializerSettings 
        { 
            ContractResolver = new CamelCasePropertyNamesContractResolver() 
        });

        return Json(data, settings);
    }

और इससे भी बेहतर, इसे Startup.cs फ़ाइल में डालें।
फेटअल्बर्ट

6

नीचे एक एक्शन विधि है जो ऑब्जेक्ट्स की एक सरणी को क्रमबद्ध करके एक जस स्ट्रिंग (कैमकेस) लौटाती है।

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);
    }

दूसरे पैरामीटर के रूप में पास किए गए JsonSerializerSettings उदाहरण पर ध्यान दें। यही ऊंटनी को बनाता है।


4

मुझे यह पसंद आया:

public static class JsonExtension
{
    public static string ToJson(this object value)
    {
        var settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            NullValueHandling = NullValueHandling.Ignore,
            ReferenceLoopHandling = ReferenceLoopHandling.Serialize
        };
        return JsonConvert.SerializeObject(value, settings);
    }
}

यह एमवीसी कोर में एक सरल विस्तार विधि है, यह आपकी परियोजना में हर वस्तु को टोज़न () क्षमता देने जा रहा है, एमवीसी परियोजना में मेरी राय में अधिकांश वस्तु में जस बनने की क्षमता होनी चाहिए, यह निश्चित रूप से निर्भर करता है :)


विधि के बाहर "सेटिंग" चर को निकालने पर विचार करें (निजी स्थिर फ़ील्ड "camelCaseSettings" के रूप में) ताकि आप हर बार एक नए चर को इनिशियलाइज़ न करें क्योंकि टोज़सन विधि कहा जाता है।
इकस

4

आपको 'Startup.cs' फ़ाइल में सेटिंग सेट करनी होगी

आपको इसे JsonConvert के डिफ़ॉल्ट मानों में भी परिभाषित करना होगा, यह तब है जब आप बाद में किसी ऑब्जेक्ट को क्रमबद्ध करने के लिए सीधे लाइब्रेरी का उपयोग करना चाहते हैं।

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
            .AddJsonOptions(options => {
                options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            });
        JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Ignore,
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
    }

ध्यान दें कि यह उत्तर ASP.NET कोर के लिए सही है, लेकिन ASP.NET के लिए नहीं है (जो प्रश्न में रूपरेखा है)।
नैट बारबेटिनी

0

यदि आप .net कोर वेब एपीआई, या IHttpAction परिणाम में ActionResult वापस कर रहे हैं, तो आप अपने मॉडल को ओके () विधि में लपेट सकते हैं जो आपके सामने के छोर पर मामले से मेल खाएगा और इसे आपके लिए अनुक्रमित करेगा। JsonConvert का उपयोग करने की आवश्यकता नहीं है। :)

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