ASP.NET Core 3.0 System.Text.Json ऊंट प्रकरण सीरियलाइज़ेशन


19

ASP.NET Core 3.0 वेब एपीआई परियोजना में, आप कैसे निर्दिष्ट करते हैं। System.Text.Json क्रमांकन विकल्प कैमल केस और इसके विपरीत पास्कल केस गुणों को क्रमबद्ध / स्वचालित करने के लिए विकल्प प्रदान करते हैं?

पास्कल केस के गुण जैसे एक मॉडल दिया गया है:

public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

और कोड टाइप करने के लिए System.Text.Json का उपयोग करने के लिए कोड एक JSON स्ट्रिंग को Personवर्ग के प्रकार में बदलने के लिए :

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Deserialize<Person>(json);

जब तक कि प्रत्येक संपत्ति के साथ JsonPropertyName का उपयोग नहीं किया जाता है, तब तक सफलतापूर्वक इसका वर्णन नहीं करता है :

public class Person
{
    [JsonPropertyName("firstname")
    public string Firstname { get; set; }
    [JsonPropertyName("lastname")
    public string Lastname { get; set; }
}

मैंने निम्नलिखित में कोशिश की startup.cs, लेकिन यह अभी भी ज़रूरत के मामले में मदद नहीं करता है JsonPropertyName:

services.AddMvc().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
});

// also the following given it's a Web API project

services.AddControllers().AddJsonOptions(options => {
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

आप नए System.Text.Json नाम स्थान का उपयोग करके ASP.NET Core 3.0 में कैमल केस क्रमबद्ध / डिसेरिएलाइज़ कैसे सेट कर सकते हैं?

धन्यवाद!

जवाबों:


25

AddJsonOptions()System.Text.Jsonकेवल MVC के लिए कॉन्फ़िगर करेगा । यदि आप JsonSerializerअपने स्वयं के कोड में उपयोग करना चाहते हैं, तो आपको इसके लिए कॉन्फ़िगरेशन पास करना चाहिए।

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Parse<Person>(json, options);

पूरी परियोजना / System.Text.Json के साथ आवेदन के लिए क्रमांकन विकल्प निर्दिष्ट करने का कोई तरीका नहीं है? यह System.Text.Json से पहले तुच्छ था
अलेक्जेंडर Staroselsky

मुझे ऐसा नहीं लगता। आपको सेटिंग्स को पास करने की आवश्यकता है
कहबाज़ी


11

इन startup.cs:

// keeps the casing to that of the model when serializing to json (default is converting to camelCase)
services.AddMvc()
    .AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null); 

इसका मतलब है कि आपको newtonsoft.json आयात करने की आवश्यकता नहीं है।

के लिए एकमात्र अन्य विकल्प options.JsonSerializerOptions.PropertyNamingPolicyहै JsonNamingPolicy.CamelCase। कोई अन्य JsonNamingPolicyनामकरण नीति विकल्प नहीं लगते हैं, जैसे कि स्नेक_केस या पास्कलकेस।


इसने मेरे लिए काम किया। FTR, मेरे पास नहीं था .AddMvc () इससे पहले मेरी सेवाओं में, केवल इसे जोड़ना ताकि AddJsonOptions जोड़ा जा सके। मेरे सभी सर्वर-क्लाइंट क्रमांकन मुद्दे चले गए .....
मार्क लैज

10

आप उपयोग कर सकते हैं PropertyNameCaseInsensitive। आपको इसे deserializer के पैरामीटर के रूप में पारित करने की आवश्यकता है।

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
var person = JsonSerializer.Deserialize<Person>(json, options);

जो ( डॉक्स से ):

हो जाता है या एक मूल्य निर्धारित करता है जो निर्धारित करता है कि संपत्ति का नाम deserialization के दौरान केस-असंवेदनशील तुलना का उपयोग करता है या नहीं। मूल मूल्य गलत है

इसलिए, यह कैमसेल कै या पास्कलकेस को निर्दिष्ट नहीं करता है लेकिन यह केस-असंवेदनशील तुलना का उपयोग करेगा। यकीन नहीं अगर यह आपकी आवश्यकताओं को पूरा करता है।


नोट: मैं इस एप्लिकेशन को कंसोल ऐप में विस्तृत सेट करने में सक्षम नहीं था। जैसा कि कहबाज़ी के उत्तर में उल्लेख किया गया है services.AddMvc().AddJsonOptionsऔर services.AddControllers().AddJsonOptionsकेवल एमवीसी और वेबएपीआई नियंत्रकों के लिए जोंस को कॉन्फ़िगर करेगा (यानी कंसोल एप्लिकेशन में व्यापक रूप से जसन सेटिंग्स एप्लिकेशन को कॉन्फ़िगर नहीं करेगा, उदाहरण के लिए)। नीचे केवल कॉन्फ़िगर किया जाएगा System.Text.Json के लिए Json एक नियंत्रक समापन बिंदु के माध्यम से पारित:

services.AddControllers()
        .AddJsonOptions(options => {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
         }); 

6

यदि आप चाहते हैं कि CamelCase क्रमांकन Startup.cs में इस कोड का उपयोग करें : (उदाहरण के लिए पहला नाम)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

यदि आप PascalCase क्रमांकन Startup.cs में इस कोड का उपयोग करना चाहते हैं : (उदाहरण के लिए FirstName)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy= null;
        );

4

आप अभी भी Microsoft.AspNetCore.Mvc.NewtonsoftJson Nuget पैकेज स्थापित करके इसे विस्तृत कर सकते हैं, जो आपको पिछले Json क्रमिक कार्यान्वयन का उपयोग करने की अनुमति देता है:

services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        });

पोक को श्रेय, यहाँ पाया गया उत्तर: IMvcBuilder AddJsonOptions कहां गया। नेट कोर 3.0?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.