আমি কীভাবে এএসপি.নেট এমভিসি নিয়ামক পদ্ধতি থেকে জেএসএন.এনইটি দ্বারা সিরিয়ালযুক্ত উটকেস জেএসওএনকে ফিরে আসতে পারি?


246

আমার সমস্যাটি হ'ল আমি JSON.NET দ্বারা সিরিয়ালযুক্ত এএসপি.নেট এমভিসি নিয়ামক পদ্ধতিগুলি থেকে অ্যাকশনারসাল্টের মাধ্যমে জেএসএন ডেটা (স্ট্যান্ডার্ড পাস্কেলকেসের বিপরীতে) জেএসএন ডেটা ফেরত আসতে চাই

উদাহরণ হিসাবে নিম্নলিখিত সি # শ্রেণি বিবেচনা করুন:

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

ডিফল্টরূপে, কোনও এমভিসি নিয়ন্ত্রকের কাছ থেকে জেএসএন হিসাবে এই শ্রেণীর কোনও উদাহরণ ফেরৎ দেওয়ার সময়, এটি নিম্নলিখিত ফ্যাশনে সিরিয়ালিত করা হবে:

{
  "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
এটি ব্যবহার করা আরও জটিল, যেহেতু আপনাকে অবশ্যই প্রতিটি নিয়ামক পদ্ধতির জন্য একটি সামগ্রীর ফলাফল কনফিগার করতে হবে।
aknuds1

2
হ্যাঁ আমি বুঝতে পেরেছি যে আপনার উত্তরটি পুনরায় ব্যবহারযোগ্য সমাধান ছিল, আমার বক্তব্যটি আরও স্পষ্ট করে জানানো হয়েছে যে এটি সিরিয়ালাইজ পদ্ধতিতে কেবলমাত্র একটি প্যারামিটার।
ওয়েবডেভার

1
আপনি যদি কোনও Controllerপদ্ধতি থেকে জেএসএনকে ফিরিয়ে দিচ্ছেন তবে আপনার সম্ভবত একটি ব্যবহার করা উচিত, সেক্ষেত্রে ApiControllerএই উত্তরটি দুর্দান্ত কাজ করে।
সাইমন হার্টচার

1
@ সিমোন হার্টারের প্রশ্নের ক্ষেত্র বিবেচনা করুন, সাধারণ ক্ষেত্রে নয়।
aknuds1

1
JSON এর জন্য বৈধ বিষয়বস্তুর ধরণটি application/jsonনয় text/plain
ফ্রেড

94

আমি ম্যাটস কার্লসনের ব্লগে এই সমস্যার একটি দুর্দান্ত সমাধান পেয়েছি । সমাধানটি হ'ল অ্যাকশনারসাল্টের একটি সাবক্লাস যা 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));
    }
}

তারপরে আপনার এমভিসি নিয়ামক পদ্ধতিতে এই ক্লাসটি নিম্নলিখিতভাবে ব্যবহার করুন:

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

3
নিখুঁত উত্তর: পরিষ্কার এবং পুনরায় ব্যবহারযোগ্য! ধন্যবাদ.
স্যান্ডার

1
এই সমাধানটি এখনও কাজ করছে। তবে এটি 4 বছর আগে প্রস্তাবিত হয়েছিল। আমাদের কি আরও ভাল সমাধান আছে?
শার্প কোডার

59

জন্য WebAPI : এই লিঙ্কে খুঁজে বার করো 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
ওয়েব এপিআই এবং এমভিসি
এএসপি.নেট

1
সুবিধার জন্য সংযোগ; এই সেটআপটি এই উত্তরের সাথে সত্যিই দুর্দান্ত অভিনয় করেছে: স্ট্যাকওভারফ্লো.com / a / 26068063 / 398630 (ভিন্ন প্রশ্ন, তবে আমি সেগুলি একসাথে ব্যবহার করি এবং এই লিঙ্কটি আমাকে এবং অন্যদের ভবিষ্যতে কিছুটা গুগল সংরক্ষণ করতে পারে)।
BrainSlugs83

37

আমি মনে করি এটি আপনার সন্ধানের সরল উত্তর। এটি শন ওয়াইল্ডমারথের ব্লগ থেকে এসেছে:

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

2
আমার ক্ষমা, ছেলেরা। আমি খুব দ্রুত এই পোস্টিং মাধ্যমে পড়া। এটি এএসপিএনট 5 এর জন্য
কোয়ান্টিয়াম

8
হাস্যকরভাবে, আপনি এখানে যে উত্তরটি দিয়েছিলেন সেটির উত্তর খুঁজতে আমি এখানে এসেছি, সুতরাং এটি ওপি-র প্রশ্নের উত্তর না হলেও এটি আমাকে যেভাবেই সহায়তা করেছিল। ধন্যবাদ! :)
পরকাস

1
আমি দ্বিতীয়টি কি বললাম @ পর্কাস! ধন্যবাদ @ কোয়ান্টিয়াম!
জিওমার

4
fyi এএসপি.নেট কোর 1.0 এর জন্য এটি উটের ক্ষেত্রে ডিফল্ট OOTB
ক্রিস মেরিসিক

3
দেখা যাচ্ছে যে এটি সর্বোপরি .NET কোর 1.0 এর জন্য ডিফল্ট নয়। এই সমাধানটি গতিশীল বৈশিষ্ট্যগুলিকে প্রভাবিত করে এবং এটি ডিফল্টরূপে প্রভাবিত হয় না। stackoverflow.com/questions/41329279/…
নীলস ব্রিনচ

13

কাস্টম ফিল্টারটির বিকল্প হ'ল জেএসওএন-তে কোনও বিষয়কে সিরিয়ালাইজ করার জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করা।

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

মার্জিত এবং সহজ।
মার্কা

1
এমনকি আপনি সেটিংসকে স্থিতিশীল পঠনযোগ্য ক্ষেত্রগুলিতে স্থানান্তর করতে এবং একটি জেজেসন পরিপূরক পদ্ধতি যুক্ত করতে পারেন।
বাষ্প

8

সহজ আইএমও আরও ভাল!

কেন আপনি এই না?

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

এএসপি.নেট কোর এমভিসিতে।

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

নোট করুন জাসনসিরাইজারসাইটিংস উদাহরণটি দ্বিতীয় প্যারামিটার হিসাবে পাস হয়েছে। এটিই উটের কেসকে ঘটায়।


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

এটি এমভিসি কোরের একটি সাধারণ বর্ধনের পদ্ধতি, এটি আপনার প্রকল্পের প্রতিটি বস্তুর ToJson () ক্ষমতা প্রদান করতে চলেছে, আমার মতামত অনুযায়ী একটি এমভিসি প্রকল্পে অবজেক্টের বেশিরভাগেরই জেসন হওয়ার ক্ষমতা থাকতে হবে, অবশ্যই এটি নির্ভর করে :)


পদ্ধতির বাইরে "সেটিংস" ভেরিয়েবলটি বের করার বিষয়ে বিবেচনা করুন (ব্যক্তিগত স্ট্যাটিক ক্ষেত্র "ক্যামেলকেসেটেটিং হিসাবে") যাতে প্রতিবার ToJson পদ্ধতিটি বলা হওয়ার পরে আপনি কোনও নতুন ভেরিয়েবল আরম্ভ করবেন না।
একুশ

4

আপনার অবশ্যই ফাইল 'স্টার্টআপ। সি' এ সেটিংস সেট করতে হবে

আপনাকে এটি জাসনকনভার্টের ডিফল্ট মানগুলিতেও সংজ্ঞায়িত করতে হবে, আপনি যদি পরে কোনও অবজেক্টকে সিরিয়ালাইজ করতে সরাসরি লাইব্রেরিটি ব্যবহার করতে চান তবে এটি হয়।

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

নোট করুন যে এই উত্তরটি এএসপি.নেট কোরের জন্য সঠিক, তবে এএসপি.এনইটি নয় (যা প্রশ্নের কাঠামো।
নাট বারবেটিনি

0

যদি আপনি। নেট কোর ওয়েব এপিআই, বা আইএইচটিপিএকশন ফলাফলে অ্যাকশন রেজাল্টটি ফিরিয়ে দিচ্ছেন তবে আপনি কেবলমাত্র একটি ঠিক () পদ্ধতিতে আপনার মডেলটি গুছিয়ে রাখতে পারেন যা আপনার সামনের প্রান্তের সাথে মিলবে এবং এটি আপনার জন্য সিরিয়াল করবে ise জসনকনভার্ট ব্যবহার করার দরকার নেই। :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.