System.Text.Json.JsonSerializer এর জন্য কীভাবে বিশ্বব্যাপী ডিফল্ট বিকল্পগুলি সেট করবেন?


12

আপডেট [2019-12-23]: ভোকাল সম্প্রদায়ের ইনপুট অংশের কারণে এই সমস্যাটি । নেট 5.0 এর রোডম্যাপে যুক্ত করা হয়েছে ।

আপডেট [2019-10-10]: যদি এই আচরণটি বাস্তবায়নের জন্য আগ্রহী হয়System.Text.Json.JsonSerializerক্রিস ইয়ুংম্যান দ্বারা চিহ্নিত ওপেন গিটহাব ইস্যুতে মাথা নিচু করে দেখুন in


এর পরিবর্তে:

JsonSerializerOptions options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};
JsonSerializer.Deserialize<SomeObject>(someJsonString, options);

আমি এই জাতীয় কিছু করতে চাই:

// This property is a pleasant fiction
JsonSerializer.DefaultSettings = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};

// This uses my options
JsonSerializer.Deserialize<SomeObject>(someJsonString); 

// And somewhere else in the same codebase...
// This also uses my options
JsonSerializer.Deserialize<SomeOtherObject>(someOtherJsonString); 

আশাটি হ'ল JsonSerializerOptionsআমাদের সর্বাধিক সাধারণ ক্ষেত্রে একটি উদাহরণ পাস করা উচিত নয় , এবং ব্যতিক্রমটির জন্য ওভাররাইড করা উচিত, নিয়ম নয়।

হিসাবে নির্দেশিত এই Q & A- , এই Json.Net একটি দরকারী বৈশিষ্ট্য। আমি তাকিয়ে ডকুমেন্টেশন জন্য System.Text.Jsonসেইসাথে এই GitHub রেপো .NET কোর জন্য। এবং এই এক

। নেট কোর 3 এ জেএসএন সিরিয়ালাইজেশন ডিফল্ট পরিচালনার জন্য কোনও এনালগ বলে মনে হচ্ছে না Or বা আমি এটি উপেক্ষা করছি?


There doesn't seem to be an analog for managing JSON serialization defaults in Core-3- আপনি কি আপনার এপিআই এর ভিতরে এবং বাইরে অনুরোধ সম্পর্কে কথা বলছেন? বা অনুরোধ এবং অন্যান্য সংস্থান থেকে প্রতিক্রিয়া?
PS2goat

@ পিএস 2 বোট আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি। এখানে বিষয়টি হ'ল (ডি) জেএসএন স্ট্রিংগুলি সিরিয়ালিয়াল করা। তারা যে কোনও সংখ্যক উত্স থেকে আসতে পারে।
ট্রেভর রেড

আমি জিজ্ঞাসা করছিলাম কারণ ইনপুট এবং আউটপুট ফর্ম্যাটারগুলির জন্য সূচনা করার সময় বিশেষ জায়গা রয়েছে (উদাহরণস্বরূপ, মডেল বাইন্ডিংয়ের জন্য)
PS2goat

আহ, গোছা। সেই অর্থে আমি মনে করি আমাদের মামলাটি "অন্যান্য সংস্থানসমূহ" এর আওতায় পড়বে। @ পিএস 2 বোট
ট্রেভর রিড

এটি সত্যিই দুঃখজনক,। নেট কোর 3.1 অবধি, এখনও কোনও ভাল অন্তর্নির্মিত জসন সিরিয়ালাইজার ছিল না।
জোক হুয়াং

উত্তর:


4

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

আরও দেখুন এই উন্মুক্ত ইস্যু


3

আপনি একটি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন। এখানে একটি উদাহরণ

আমি বিশেষ সেটিংস তৈরির জন্য বনাম পৃথক পদ্ধতি ব্যবহার করি, যাতে সমস্ত সেটিংস একটি স্পটে থাকে এবং সহজেই পুনরায় ব্যবহারযোগ্য হয়।

public static class DeserializeExtensions
{
    private static JsonSerializerOptions defaultSerializerSettings = new JsonSerializerOptions();

    // set this up how you need to!
    private static JsonSerializerOptions featureXSerializerSettings = new JsonSerializerOptions();


    public static T Deserialize<T>(this string json)
    {       
        return JsonSerializer.Deserialize<T>(json, defaultSerializerSettings);
    }

    public static T DeserializeCustom<T>(this string json, JsonSerializerOptions settings)
    {
        return JsonSerializer.Deserialize<T>(json, settings);
    }

    public static T DeserializeFeatureX<T>(this string json)
    {
        return JsonSerializer.Deserialize<T>(json, featureXSerializerSettings);
    }
}

তারপরে আপনি এটিকে স্ট্রিংয়ের পদ্ধতি হিসাবে আখ্যায়িত করুন অথবা আক্ষরিক হোক না কেন।

    Car result = @"{""Wheels"": 4, ""Doors"": 2}".DeserializeFeatureX<Car>();

আহ, আপনার অন্য জাসন। নেট নির্ভর উত্তর, আমার মনে হয়। এই প্রশ্নটি System.Text.Json.JsonSerializerঅতিরিক্ত নির্ভরতা ছাড়াই নেট কোর -৩.০ সম্পর্কিত। ধন্যবাদ।
ট্রেভর রিড

2
এটি বিমূর্ততার সৌন্দর্য। এই এক্সটেনশন ক্লাসের বাইরে কোনও কোড পরিবর্তন হয়নি! আমি বিল্ট ইন সবেমাত্র আপডেট করেছি System.Text.Json.JsonSerializer। ধারণাটিও ঠিক একই ছিল। আমি উদাহরণ লিঙ্কটিও আপডেট করেছি।
PS2goat

3

JsonSerializer.NET কোর 3.1 এর জন্য ডিফল্ট বিকল্পগুলি প্রকাশিত হয় না । তবে, ডিসেম্বর, 2019 পর্যন্ত এটি 5.0 এর জন্য রোড ম্যাপে যুক্ত করা হয়েছে ।

.20 নেট প্রকাশের সম্ভাবনা 2020 নভেম্বর, আশা করা যায় But তবে কোনও নির্দিষ্ট সময়ে এই নির্দিষ্ট সমস্যাটি মোকাবেলা করার কোনও গ্যারান্টি নেই। অপেক্ষার ব্যতীত, এই উত্তরগুলি কার্যবিধির প্রস্তাব দেয়:


2

নীচে গিটহাব ব্যবহারকারী আন্ড্রে-এসএস by দ্বারা একটি কাজের প্রস্তাব দেওয়া হয়েছে :

((JsonSerializerOptions)typeof(JsonSerializerOptions)
    .GetField("s_defaultOptions", 
        System.Reflection.BindingFlags.Static |
        System.Reflection.BindingFlags.NonPublic).GetValue(null))
    .PropertyNameCaseInsensitive = true;

-1

(আপনি যদি কখনও জসন.এনইটি ব্যবহার করতে স্যুইচ করেন)

আমি সুস্পষ্ট হওয়া এবং সমস্ত কলগুলিতে সেটিংস পাস করার পক্ষে পছন্দ করি এবং আপনি ডিফল্টসেটেটিংয়ের সাথে ডিফল্ট সেট করতে পারেন ।

JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;

এবং তারপর

var json = JsonConvert.SerializeObject(o1);
var o2 = JsonConvert.DeserializeObject(x);

@Tymtam এর এই উত্তর এবং লিঙ্কটি জসন.নেটের ক্ষেত্রে প্রযোজ্য। আপনার প্রশ্নটি সিমিয়ালারের আচরণ সম্পর্কিত, System.Text.Jsonযাতে জেএসএন সিরিয়ালাইজেশন। নেট কোর 3.0 এ বেকড 3.0 সাড়া দেওয়ার জন্য সময় দেওয়ার জন্য ধন্যবাদ।
ট্রেভর রেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.