ওয়েব এপিআই 2: কীভাবে উটসেসযুক্ত সম্পত্তির নাম, বস্তু এবং তাদের উপ-বস্তুগুলিতে জেএসএনকে ফিরিয়ে আনতে হবে


104

হালনাগাদ

সবগুলো উত্তরের জন্য ধন্যবাদ। আমি একটি নতুন প্রকল্পে আছি এবং দেখে মনে হচ্ছে অবশেষে আমি এর তলানিতে পৌঁছেছি: দেখে মনে হচ্ছে নিম্নলিখিত কোডটি আসলে দোষারোপ করেছিল:

public static HttpResponseMessage GetHttpSuccessResponse(object response, HttpStatusCode code = HttpStatusCode.OK)
{
    return new HttpResponseMessage()
    {
        StatusCode = code,
        Content = response != null ? new JsonContent(response) : null
    };
}

অন্যত্র ...

public JsonContent(object obj)
{
    var encoded = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore } );
    _value = JObject.Parse(encoded);

    Headers.ContentType = new MediaTypeHeaderValue("application/json");
}

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

এটি সর্বত্র ব্যবহৃত হয় ... আমি কি প্রথম বলি, ডাব্লুটিএফ? বা সম্ভবত এটি হওয়া উচিত "তারা কেন এটি করছে?"


মূল প্রশ্ন অনুসরণ

কেউ ভাবেন যে এটি একটি সাধারণ কনফিগারেশন সেটিংস হবে তবে এটি আমাকে খুব দীর্ঘকাল ধরে বহিষ্কার করেছে।

আমি বিভিন্ন সমাধান এবং উত্তরগুলি দেখেছি:

https://gist.github.com/rdingwall/2012642

সর্বশেষতম ওয়েবএপিআই সংস্করণে প্রয়োগ করা হবে বলে মনে হচ্ছে না ...

নিম্নলিখিতগুলি কাজ করে বলে মনে হচ্ছে না - সম্পত্তির নামগুলি এখনও পাসক্যাসেলযুক্ত।

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;

json.UseDataContractJsonSerializer = true;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;

json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

মায়াঙ্কের উত্তর এখানে: ক্যামেলকেস জেএসওন ওয়েবএপিআই সাব-অবজেক্টস (নেস্টেড অবজেক্টস, চাইল্ড অবজেক্টস) মনে হচ্ছিল যতক্ষণ না আমি লিনক টু এসকিএল ব্যবহার করছি সেহেতু এই বৈশিষ্ট্যগুলি উত্পন্ন কোডে যুক্ত করা উচিত ...

এটি কোনওভাবেই স্বয়ংক্রিয়ভাবে করবেন? এই 'বাজে' আমাকে দীর্ঘকাল ধরে জর্জরিত করেছে।



এছাড়াও লিনক 2 এসকিউএল আংশিক ক্লাস উত্পাদন করার একটি কারণ রয়েছে। এছাড়াও ... লিনক 2 এসকিউএল ডাব্লুটিএফ ?!
আরন

1
ধন্যবাদ তবে এই লিঙ্কটি এমভিসির জন্য, এটির ওয়েব এপিআই 2 আমি ব্যবহার করছি এবং আমি নিশ্চিত নই যে এই ধরণের বিষয়বস্তু টাইপ সেট করার কোনও উপায় আছে কিনা, এবং একটি স্ট্রিং ফিরে আসবে, তবে যদি তা না হয় তবে মনে হয় না বেশ সঠিক সমাধানের মতো .. আংশিক ক্লাস সম্পর্কেও পরামর্শের জন্য ধন্যবাদ, তবে আংশিক অন্যান্য অংশে সংজ্ঞায়িত কোনও সম্পত্তিতে কোনও বৈশিষ্ট্য যুক্ত করা কি সম্ভব?
টম

এছাড়াও হ্যাঁ, linq2sql wtf ... আমার সিদ্ধান্ত নয় :)
টম

ফলাফল একই, একমাত্র পার্থক্য আপনি যেখানে ইনজেক্ট করেন JsonSerializerstackoverflow.com/questions/13274625/…
অ্যারন

উত্তর:


175

এগুলি সব একসাথে রেখে আপনি পাবেন ...

protected void Application_Start()
{
    HttpConfiguration config = GlobalConfiguration.Configuration;
    config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;
}

অবশ্যই এটি চালু করার উপায়, তবে আমার সমস্যাটি হ'ল এই সেটিংটি উপেক্ষা করা হচ্ছে (আমার উত্তর দেখুন)
টম

1
@ টম এরম ... টম কি জানতেন কী json.UseDataContractJsonSerializer = true;করে? এটি ওয়েবএপিআইকে Json.Netসিরিয়ালাইজেশনের জন্য ব্যবহার না করতে বলে । > _ <
আরন

হ্যাঁ, আমি এখন করি। তবে একটি অতিরিক্ত সমস্যাও ছিল। আমি এটি যাচাই করেছি। আমার উত্তর দেখুন। এছাড়াও স্ট্যাকওভারফ্লো.com
টম

1
প্রকৃতপক্ষে, কাছাকাছি পরিদর্শন করার পরে এটি প্রমাণিত হয়েছে যে আমার আগের উপসংহারে আমার ভুল হয়েছিল। আমার আপডেট দেখুন।
টম

28

এটিই আমার পক্ষে কাজ করেছে:

internal static class ViewHelpers
{
    public static JsonSerializerSettings CamelCase
    {
        get
        {
            return new JsonSerializerSettings {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            };
        }
    }
}

এবং তারপর:

[HttpGet]
[Route("api/campaign/list")]
public IHttpActionResult ListExistingCampaigns()
{
    var domainResults = _campaignService.ListExistingCampaigns();
    return Json(domainResults, ViewHelpers.CamelCase);
}

বর্গ CamelCasePropertyNamesContractResolverথেকে আসে Newtonsoft.Json.dllমধ্যে Json.NET গ্রন্থাগার।


3
এই অ্যাপ্লিকেশনটি খুব কার্যকর যখন কোনও ব্যক্তি কেবলমাত্র কিছু এপিআই-এর জন্য উটকে আবদ্ধ করতে চান, তবে অ্যাপ্লিকেশনটির সমস্ত এপিআইয়ের জন্য নয়। (Y)
droidbot

15

এটা দেখা যাচ্ছে যে

return Json(result);

অপরাধী ছিল, সিরিয়ালাইজেশন প্রক্রিয়াটি ক্যামেলকেস সেটিংটিকে উপেক্ষা করে। এবং সেটা

return Request.CreateResponse(HttpStatusCode.OK, result, Request.GetConfiguration());

আমি খুঁজছিলাম যে droid ছিল?

এছাড়াও

json.UseDataContractJsonSerializer = true;

কাজগুলিতে একটি স্প্যানার স্থাপন করছিল এবং আমি যে ড্রোডটি খুঁজছিলাম তা হ'ল না।


এটি আসলে ভুল উত্তর। প্রশ্নে আমার আপডেট দেখুন।
টম

আমি আসলে এটি কেস হিসাবে পাওয়া যায়। ফিরে আসার সময় Json(result), আমি প্যাসকেলকেসে সমস্ত কিছু দেখছিলাম, কিন্তু আমি ফিরে এসে Content(StatusCode, result)এটি প্রত্যাশা অনুযায়ী কাজ করেছি।
DeeKayy90

12

ওউনি হোস্টিং এবং নিনজেক্টের সাথে উপরের সমস্ত উত্তর আমার পক্ষে কার্যকর হয়নি। আমার জন্য যা কাজ করেছে তা এখানে:

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Get the ninject kernel from our IoC.
        var kernel = IoC.GetKernel();

        var config = new HttpConfiguration();

        // More config settings and OWIN middleware goes here.

        // Configure camel case json results.
        ConfigureCamelCase(config);

        // Use ninject middleware.
        app.UseNinjectMiddleware(() => kernel);

        // Use ninject web api.
        app.UseNinjectWebApi(config);
    }

    /// <summary>
    /// Configure all JSON responses to have camel case property names.
    /// </summary>
    private void ConfigureCamelCase(HttpConfiguration config)
    {
        var jsonFormatter = config.Formatters.JsonFormatter;
        // This next line is not required for it to work, but here for completeness - ignore data contracts.
        jsonFormatter.UseDataContractJsonSerializer = false;
        var settings = jsonFormatter.SerializerSettings;
#if DEBUG
        // Pretty json for developers.
        settings.Formatting = Formatting.Indented;
#else
        settings.Formatting = Formatting.None;
#endif
        settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    }
}

মূল পার্থক্য হ'ল গ্লোবাল কনফিগারেশন-কনফিগারেশন না করে নতুন এইচটিপিপি কনফিগারেশন ()।


OWIN এর মাধ্যমে স্ব-হোস্টিংয়ের জন্য, এটি নিখুঁত। ধন্যবাদ!
জুলিয়ান মেলভিল

3
আপনি যদি ওউইন ব্যবহার করে থাকেন তবে এই সমাধানটি পুরোপুরি কার্যকর হয়, তবে কেবলমাত্র আপনি সমস্ত চুল ছিঁড়ে ফেলেছেন!
অ্যালিস্টার

10

ওয়েবএপিপিফিনি কোড:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            //This line sets json serializer's ContractResolver to CamelCasePropertyNamesContractResolver, 
            //  so API will return json using camel case
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

        }
    }


আপনার এপিআই অ্যাকশন পদ্ধতিটি নিম্নলিখিত উপায়ে ডেটা প্রত্যাবর্তন করে এবং আপনি জসন. নেট / নিউটোনসফট.জসন ইনস্টল করা সর্বশেষ সংস্করণ ইনস্টল করেছেন তা নিশ্চিত করুন:

    [HttpGet]
    public HttpResponseMessage List()
    {
        try
        {
            var result = /*write code to fetch your result*/;
            return Request.CreateResponse(HttpStatusCode.OK, cruises);
        }
        catch (Exception ex)
        {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
        }
    }

4

আপনার ওউইন স্টার্টআপে এই লাইনটি যুক্ত করুন ...

 public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var webApiConfiguration = ConfigureWebApi();            
        app.UseWebApi(webApiConfiguration);
    }

    private HttpConfiguration ConfigureWebApi()
    {
        var config = new HttpConfiguration();

        // ADD THIS LINE HERE AND DONE
        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

        config.MapHttpAttributeRoutes();
        return config;
    }
}

3

এখানে একটি অস্পষ্টতা রয়েছে, যখন রুটের বৈশিষ্ট্যটি জিইটি ইউরালের সাথে মেলে না তবে জিইটি ইউআরএল পদ্ধতির নামের সাথে মেলে, তবে জসনসিরিয়ালাইজার উটের মামলার নির্দেশকে অগ্রাহ্য করা হবে যেমন

HTTP: // ওয়েবসাইট / API / জিও / geodata

//uppercase fail cakes
[HttpGet]
[Route("countries")]
public async Task<GeoData> GeoData()
{
    return await geoService.GetGeoData();
}

//lowercase nomnomnom cakes
[HttpGet]
[Route("geodata")]
public async Task<GeoData> GeoData()
{
    return await geoService.GetGeoData();
}

2

আমি এটি নিম্নলিখিত পদ্ধতিতে সমাধান করেছি।

[AllowAnonymous]
[HttpGet()]
public HttpResponseMessage GetAllItems(int moduleId)
{
    HttpConfiguration config = new HttpConfiguration();
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;

            try
            {
                List<ItemInfo> itemList = GetItemsFromDatabase(moduleId);
                return Request.CreateResponse(HttpStatusCode.OK, itemList, config);
            }
            catch (System.Exception ex)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message);
            }
}

0

আমি বাতাসের সাথে ওয়েবএপি ব্যবহার করছি এবং বাতাসের নিয়ামককে একটি বিনা বাতাসের ক্রিয়াটি কার্যকর করার চেষ্টা করার সময় আমি একই সমস্যাটি চালিয়েছিলাম। আমি অ্যাপ্র্যাচ অনুরোধটি ব্যবহার করার চেষ্টা করেছি etGETConfigration তবে একই ফলাফল। সুতরাং, যখন আমি অনুরোধের মাধ্যমে ফিরে আসা বস্তুটি অ্যাক্সেস করি etGETConfigration আমি বুঝতে পারি যে অনুরোধের মাধ্যমে ব্যবহৃত সিরিয়ালাইজারটি হ'ল যাদু করার জন্য বায়ু-সার্ভার ব্যবহার করে। যাইহোক, আমি একটি আলাদা এইচটিটিপি কনফিগারেশন তৈরি করে আমার সমস্যাটি সমাধান করেছি:

public static HttpConfiguration BreezeControllerCamelCase
        {
            get
            {
                var config = new HttpConfiguration();
                var jsonSerializerSettings = config.Formatters.JsonFormatter.SerializerSettings;
                jsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                jsonSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;

                return config;
            }
        }

এবং অনুরোধে এটি প্যারামিটার হিসাবে পাস করুন re

return this.Request.CreateResponse(HttpStatusCode.OK, result, WebApiHelper.BreezeControllerCamelCase);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.