System.Text.Json.JsonSerializer के लिए विश्व स्तर पर डिफ़ॉल्ट विकल्प कैसे सेट करें?


12

अद्यतन [२०१ ९ -१२-२३]: मुखर समुदाय इनपुट के भाग के कारण यह मुद्दा .NET ५.० के लिए रोडमैप में जोड़ा गया है ।

अद्यतन [२०१ ९-१०-१०]: यदि इस व्यवहार को देखने के लिए इच्छुक हैंSystem.Text.Json.JsonSerializerक्रिस Gungmann द्वारा बताया गया है कि खुले GitHub मुद्दे पर सिर और में वजन।


इसके अलावा:

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 में JSON क्रमांकन चूक को प्रबंधित करने के लिए एक एनालॉग प्रतीत नहीं होता है।


There doesn't seem to be an analog for managing JSON serialization defaults in Core-3- क्या आप अपने एपीआई में और बाहर अनुरोधों के बारे में बात कर रहे हैं? या अन्य संसाधनों के लिए अनुरोध और प्रतिक्रियाएं?
222 बजे ps2goat

@ ps2goat मुझे यकीन नहीं है कि मैं आपके प्रश्न को समझता हूं। यहां मामला JSON स्ट्रिंग्स को क्रमबद्ध करने (डी) का है। वे किसी भी स्रोत से आ सकते थे।
ट्रेवर रीड

मैं पूछ रहा था क्योंकि इनपुट और आउटपुट
फॉर्मेटर्स के

आह, गच्चा। इस अर्थ में मुझे लगता है कि हमारा मामला "अन्य संसाधनों" के तहत आएगा। @ ps2goat
ट्रेवर रीड

यह वास्तव में दुखद है, .net core 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>();

आह, तुम्हारा एक और Json.Net निर्भर उत्तर है, मुझे लगता है। यह सवाल System.Text.Json.JsonSerializerअतिरिक्त निर्भरता के बिना NET Core-3.0 के बारे में है। धन्यवाद।
ट्रेवर रीड

2
वह अमूर्तता का सौंदर्य है। इस एक्सटेंशन क्लास के बाहर कोई कोड नहीं बदलता है! मैंने अभी बिल्ट इन अपडेट किया है System.Text.Json.JsonSerializer। अवधारणा बिल्कुल वैसी ही थी। मैंने उदाहरण लिंक भी अपडेट किया है।
Ps2goat

3

JsonSerializer.NET कोर 3.1 के लिए डिफ़ॉल्ट विकल्प उजागर नहीं होते हैं । हालांकि, दिसंबर, 2019 तक इसे 5.0 के लिए रोड मैप में जोड़ दिया गया है ।

.NET 5.0 की रिलीज़ नवंबर, 2020 तक होने की उम्मीद है लेकिन इसकी कोई गारंटी नहीं है कि इस विशेष मुद्दे को किसी विशेष समय पर संबोधित किया जाएगा। प्रतीक्षा के अलावा, ये जवाब वर्कअराउंड का सुझाव देते हैं:


2

GitHub उपयोगकर्ता द्वारा andre-ss6 द्वारा एक वैकल्पिक हल प्रस्तावित किया गया है:

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

-1

(यदि आप कभी भी Json.NET का उपयोग करने के लिए स्विच करते हैं)

मैं पसंद करता हूं और स्पष्ट होने की सलाह देता हूं और सभी कॉल के लिए सेटिंग्स पास करता हूं, लेकिन आप डिफॉल्ट्स के साथ डिफॉल्ट सेट कर सकते हैं ।

JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;

और फिर

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

@Tymtam द्वारा यह उत्तर और लिंक Json.Net पर लागू होता है। थि प्रश्न में सिमिलर व्यवहार की चिंता की जाती है, System.Text.Jsonजो कि JSON सीरियलाइजेशन .NET कोर 3.0 में बेक किया गया है। प्रतिउत्तर हेतु समय लेने के लिए धन्यवाद।
ट्रेवर रीड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.