জেএসন () থেকে এএসপি.এনইটি এমভিসি-তে ছোট ছোট সংখ্যার নাম জোর করে


90

নিম্নলিখিত ক্লাস দেওয়া,

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

    public string Message { get; set; }
}

আমি এগুলির মধ্যে একটির মতো একটি নিয়ামক ক্রিয়ায় ফিরে আসছি,

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

তবে আমার ক্লায়েন্টের পক্ষের কাঠামোটি এই বৈশিষ্ট্যগুলি ছোট হাতের সাফল্য এবং বার্তা হিসাবে প্রত্যাশা করে। প্রকৃতপক্ষে ছোট ছোট সম্পত্তির নাম না থাকলে এই চিন্তাটি সাধারণ জসনের ফাংশন কলকে বোঝানোর উপায় কি?

উত্তর:


132

এটি অর্জনের উপায়টি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
নিক্লাস লিন্ডকভিস্ট

আমি কীভাবে deserialize করব? প্রাক্তন "ছোট" থেকে "ছোট"
রক

4
@ নিকলাসলিন্ডকভিস্ট আধুনিক জেএসওএন.এনইটি সংস্করণগুলির জন্য, সর্প_কেস পাওয়ার অনেক সহজ উপায় রয়েছে: নিউটোনসটফট
সেরেন

17

আপনি যদি ওয়েব এপিআই ব্যবহার করে থাকেন তবে সিরিয়ালাইজার পরিবর্তন করা সহজ, তবে দুর্ভাগ্যক্রমে এমভিসি নিজেই JavaScriptSerializerএটিকে 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পরীক্ষার সাহায্যে):

ফিল্টারকনফিগ। সি

// ...
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

যদিও এটি একটি পুরানো প্রশ্ন, কোড স্নিপেটের নীচে থাকা অন্যদের পক্ষে সহায়ক হবে আশা করি,

আমি নীচে এমভিসি 5 ওয়েব এপিআই দিয়েছিলাম।

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