জেসন কীগুলি .NET- এ ছোট হাতের অক্ষর রয়েছে তা নিশ্চিত করে


103

কীগুলি লো কেস হিসাবে প্রেরণ করা হয়েছে তা নিশ্চিত করার জন্য। নেট এ JSON ব্যবহার করার কি সহজ উপায় আছে?

এই মুহুর্তে আমি নিউটনসফটের জসন.এনইটি লাইব্রেরিটি ব্যবহার করছি এবং সহজভাবে ব্যবহার করছি

string loginRequest = JsonConvert.SerializeObject(auth);

এই ক্ষেত্রে authশুধুমাত্র অনুসরণ অবজেক্ট

public class Authority
{
    public string Username { get; set; }
    public string ApiToken { get; set; }
}

এর ফলে

{"Username":"Mark","ApiToken":"xyzABC1234"}

কী usernameএবং apitokenকীগুলি ছোট হাতের অক্ষর হয়ে আসে তা নিশ্চিত করার কোনও উপায় আছে ?

আমি String.ToLower()অবশ্যই এটি অবশ্যই চালাতে চাই না কারণ মানগুলি usernameএবং apitokenমিশ্র ক্ষেত্রে রয়েছে।

আমি বুঝতে পেরেছি যে আমি প্রগ্রেম্যাটিকভাবে এটি করতে পারি এবং নিজেই JSON স্ট্রিং তৈরি করতে পারি, তবে আমার প্রায় 20 বা তাই JSON ডেটা স্ট্রিংয়ের জন্য এটি প্রয়োজন এবং আমি নিজেকে কিছুটা সময় বাঁচাতে পারছি কিনা তা দেখছি। আমি ভাবছি যে এমন কোনও ইতিমধ্যে নির্মিত লাইব্রেরি রয়েছে যা আপনাকে কী তৈরির জন্য ছোট হাতের প্রয়োগ করতে অনুমতি দেয়।


হয়তো জসন সিরিয়ালাইজেশন লাইব এমন কিছু ধরণের সিরিয়ালাইজেশন বৈশিষ্ট্য সরবরাহ করে যা আপনি নিজের সম্পত্তিগুলির জেসন-সিরিয়ালাইজড নাম পরিবর্তন করতে ব্যবহার করতে পারেন?
টিডামার্স

@ স্টাডামার্স, ধন্যবাদ আমি এমন কিছু আবিষ্কার করার চেষ্টা করছি যা এটি করে তবে এটি এখনও ব্যর্থ। এখানে কারও আশা করা আমার দিকে ইঙ্গিত করতে পারে।
চিহ্নিত করুন

1
আপনি যদি অর্থে একটি শব্দ নিয়ে থাকেন তবে এটি কার্যকর হতে পারে।
লিপোটাম

হাহ। আমার বিপরীত সমস্যা হচ্ছে ... এছাড়াও - এটি মজার বিষয় যে আপনি "ব্যবহারকারীর নাম" মিশ্র ক্ষেত্রে উল্লেখ করেছেন is আপনি কি "ব্যবহারকারীর নাম" বলতে চাইছেন?
BrainSlugs83

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

উত্তর:


176

আপনি এটির জন্য একটি কাস্টম চুক্তি সমাধানকারী তৈরি করতে পারেন। নিম্নলিখিত চুক্তির সমাধানকারী সমস্ত কীগুলি ছোট হাতের মধ্যে রূপান্তর করবে:

public class LowercaseContractResolver : DefaultContractResolver
{
    protected override string ResolvePropertyName(string propertyName)
    {
        return propertyName.ToLower();
    }
}

ব্যবহার:

var settings = new JsonSerializerSettings();
settings.ContractResolver = new LowercaseContractResolver();
var json = JsonConvert.SerializeObject(authority, Formatting.Indented, settings);

এর ফলস্বরূপ:

{"username":"Mark","apitoken":"xyzABC1234"}

আপনি যদি সর্বদা LowercaseContractResolverএটির ব্যবহার করে সিরিয়ালাইজ করতে চান তবে নিজের পুনরাবৃত্তি এড়াতে ক্লাসে এটি মোড়ানো বিবেচনা করুন:

public class LowercaseJsonSerializer
{
    private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    {
        ContractResolver = new LowercaseContractResolver()
    };

    public static string SerializeObject(object o)
    {
        return JsonConvert.SerializeObject(o, Formatting.Indented, Settings);
    }

    public class LowercaseContractResolver : DefaultContractResolver
    {
        protected override string ResolvePropertyName(string propertyName)
        {
            return propertyName.ToLower();
        }
    }
}

যা এর মতো ব্যবহার করা যেতে পারে:

var json = LowercaseJsonSerializer.SerializeObject(new { Foo = "bar" });
// { "foo": "bar" }

এএসপি.নেট এমভিসি 4 / ওয়েবএপিআই

আপনি যদি এএসপি.নেট এমভিসি 4 / ওয়েবএপিআই ব্যবহার করছেন তবে আপনি CamelCasePropertyNamesContractResolverনিউটনসফট.জসন লাইব্রেরি থেকে একটি ডিফল্টরূপে অন্তর্ভুক্ত ব্যবহার করতে পারেন ।


বিপরীতে এটি করার কোনও যুক্তিসঙ্গত উপায়? Deserialization জন্য?
শান রোয়ান

1
@ আঞ্জিও আমি নিজে এটি করার চেষ্টা করিনি, এবং নথিপত্রে আমি সে সম্পর্কে কোনও তথ্য পাইনি। একটি সমাধান হ'ল জসনকনভার্ট.সরিয়ালাইজ অবজেক্টটি আপনার নিজের ক্লাসে মোড়ানো। আমার আপডেট দেখুন।
অ্যালেক্সন

3
দেখে মনে হচ্ছে, এই কাস্টম কন্ট্রাক্টস্রোলভার জেসনপ্রোপার্টি বৈশিষ্ট্যটিকে বিবেচনা করে না, যদি আপনি ব্যতিক্রমগুলি নির্দিষ্ট করতে চান ... যেমন [জসনপ্রোপার্টি ("বিকল্প নাম")] এখনও নিচে অবস্থিত হয় বা এটি করার অন্য কোনও উপায় আছে?
rekna

2
নির্দেশক জন্য +1 CamelCasePropertyNamesContractResolver। এখন আমি পেয়েছি System.Net.Http.Formatting.JsonContractResolverওয়েবএপিআই-এ ডিফল্ট এবং এই শ্রেণিটি অভ্যন্তরীণ। আমি JsonContractResolverউটের ক্ষেত্রে পুনর্লিখনের সাথে শেষ করি । কেউ এটিকে সর্বজনীন অ্যাসপেনটেমবস্ট্যাক.কোড্লেক্স
ওয়ার্কেম /

10
CamelCasePropertyNamesContratResolverছোট অক্ষরে বৈশিষ্ট্যগুলি রূপান্তর করবেন না, কেবল প্রথম চর।
ToXinE

23
protected void Application_Start() {
    JsonConfig.Configure();   
}

public static class JsonConfig
{
    public static void Configure(){
        var formatters = GlobalConfiguration.Configuration.Formatters;
        var jsonFormatter = formatters.JsonFormatter;
        var settings = jsonFormatter.SerializerSettings;

        settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    }
}

10

ইন Json.NET 9.0.1 এবং পরে তা নিশ্চিত করার জন্য সব অবস্থায় বৈশিষ্টগুলির নাম একটি কাস্টম ব্যবহার করে ছোট হাতের অক্ষরে রূপান্তরিত হয় সম্ভব NamingStrategy। এই শ্রেণিটি চুক্তির সমাধানকারী থেকে পৃথক, লাইটওয়েট অবজেক্টে সেট করা যেতে পারে এমন সম্পত্তির নাম অ্যালগরিদমিক পুনর্নির্মাণের যুক্তিটি বের করে DefaultContractResolver.NamingStrategy। এটি করার ফলে একটি কাস্টমContractResolver তৈরির প্রয়োজন এড়ানো যায় এবং ইতিমধ্যে তাদের নিজস্ব চুক্তি সমাধানকারীদের ফ্রেমওয়ার্কগুলিতে একীকরণ করা আরও সহজ হতে পারে।

LowercaseNamingStrategyনিম্নলিখিত হিসাবে সংজ্ঞা দিন :

public class LowercaseNamingStrategy : NamingStrategy
{
    protected override string ResolvePropertyName(string name)
    {
        return name.ToLowerInvariant();
    }
}

তারপরে নিম্নরূপে সিরিয়ালাইজ করুন:

var settings = new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver { NamingStrategy = new LowercaseNamingStrategy() },
};
string loginRequest = JsonConvert.SerializeObject(auth, settings);

মন্তব্য -

  • ব্যবহারটি string.ToLowerInvariant()নিশ্চিত করে যে সমস্ত চুক্তিতে একই চুক্তি তৈরি হয়েছে।

  • কিনা উপেক্ষিত সম্পত্তি নাম, অভিধান কী ও এক্সটেনশন ডেটা নাম lowercased করা হয় তা নিয়ন্ত্রণ করার জন্য, আপনাকে সেট করতে পারেন NamingStrategy.OverrideSpecifiedNames, NamingStrategy.ProcessDictionaryKeysঅথবা NamingStrategy.ProcessExtensionDataNamesকরার জন্য (Json.NET 10.0.1 এবং পরে) true

  • আপনি সেরা পারফরম্যান্সের জন্য চুক্তি সমাধানের সমাধান করতে পারেন ।

  • যদি আপনার ফ্রেমওয়ার্কটিতে সিরিয়ালাইজার সেটিংসে অ্যাক্সেস না থাকে তবে আপনি নীচে NamingStrategyনিজের অবজেক্টে সরাসরি প্রয়োগ করতে পারেন :

    [JsonObject(NamingStrategyType = typeof(LowercaseNamingStrategy))]
    public class Authority
    {
        public string Username { get; set; }
        public string ApiToken { get; set; }
    }
  • সংশোধন না NamingStrategyএর CamelCasePropertyNamesContractResolver। এই চুক্তির সমাধানের সমাধানকারী এর সমস্ত উদাহরণ জুড়ে বিশ্বব্যাপী তথ্য ভাগ করে দেয় এবং তাই কোনও এক উদাহরণ পরিবর্তন করে অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া হতে পারে।


8

আপনি "জসনপ্রপার্টি" ব্যবহার করতে পারেন:

ব্যবহার:

public class Authority
{
    [JsonProperty("userName")] // or [JsonProperty("username")]
    public string Username { get; set; }
    [JsonProperty("apiToken")] // or [JsonProperty("apitoken")]
    public string ApiToken { get; set; }
}

var json  = JsonConvert.SerializeObject(authority);

0

আমার জন্য আমি অন্যান্য উত্তরগুলির কয়েকটি সংমিশ্রণ ব্যবহার করেছি এবং এটি দিয়ে শেষ করেছি

        return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        });

আমি নিজের সন্ধানের জন্য খুঁজছিলাম না বলে আমি যা খুঁজছিলাম তার একটি সমাধানের কাছাকাছি ছিল

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