मेरे पास इस तरह परिभाषित एक वस्तु है

public class FilingSearchCriteria
{
    public int? FilerId { get; set; }
    public int? TypeId { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    public bool? Legacy { get; set; }
    public bool? NoAtttachments { get; set; }
    public bool? MissingFields { get; set; }
    public bool? MissingAttachments { get; set; }
    public string DocketNumber { get; set; }
 
}

एक नेट कोर नियंत्रक इसे एक पैरामीटर के रूप में लेता है। मुद्दा ज्यादातर समय होता है कि JSON में केवल कुछ ही गुण होते हैं (डिज़ाइन द्वारा), जो एक अक्रमांकन विफलता का कारण बनता है, इसलिए मेरे नियंत्रक को जो मिलता है वह उपरोक्त वस्तु है जिसमें सभी गुण शून्य पर सेट होते हैं।

मैं डिफ़ॉल्ट नेट कोर system.text.json serialzier को "आंशिक" ऑब्जेक्ट को स्वीकार करने के लिए कैसे कह सकता हूं?

आने वाले JSON को जोड़ना

{"EndDate":"Tue, 02 Feb 2021 18:07:33 GMT","StartDate":"Tue, 26 Jan 2021 18:07:33 GMT"}
1
americanslon 2 फरवरी 2021, 20:04
आपने जो वर्णन किया वह अजीब है। मुझे नहीं लगता कि जेसन सीरिएलाइज़र (जो भी तरह का) डिफ़ॉल्ट रूप से उस तरह से काम करता है। यदि जेसन में प्रदान की गई कोई भी गुण कक्षा में किसी भी गुण से मेल खाता है, तो संबंधित गुणों को मानों के साथ सही ढंग से पॉप्युलेट किया जाना चाहिए। आपको अपना जेसन भी पोस्ट करना चाहिए (और ऐसा लगता है कि आपने अभी तक डिबगिंग की कोशिश भी नहीं की है)।
 – 
King King
2 फरवरी 2021, 21:00
सही? मैंने भी यही सोचा था। मैं वास्तव में नहीं जानता कि इसे कैसे डिबग करना है, इसलिए मैं यहां क्यों हूं। यह क्या कर रहा है यह देखने के लिए मुझे नियंत्रक deserialization प्रक्रिया में खुद को इंजेक्ट करने का कोई तरीका नहीं है। नेट कोर में माइग्रेट होने के बाद यह पूरी तरह से काम करने वाला ऐप है। पुराने ASP.Net संस्करण में Newtonsoft का उपयोग किया गया था लेकिन कोर संस्करण के लिए मैं डिफ़ॉल्ट System.Text.Json के साथ रहना चाहता था। मैंने आने वाले जेसन को पोस्ट किया है
 – 
americanslon
2 फरवरी 2021, 21:05
मैं आपकी समस्या का पुनरुत्पादन नहीं कर सकता। अगर मैं सिर्फ JsonSerializer.Deserialize<FilingSearchCriteria>("{}") करता हूं तो एक FilingSearchCriteria सभी गुणों के साथ वापस आ जाता है, देखें dotnetfiddle.net/ G1CeeC.
 – 
dbc
2 फरवरी 2021, 21:09
वास्तव में क्या भेजा गया है (अनुरोध निकाय में) यह देखने के लिए आप डेवलपर इंस्पेक्टर टूल (यदि ब्राउज़र का उपयोग कर रहे हैं) खोल सकते हैं। वहां आपको भेजे गए जेसन को सत्यापित करना चाहिए।
 – 
King King
2 फरवरी 2021, 21:10
ठीक है, उस JSON नमूने के साथ मुझे निम्न अपवाद मिल रहा है: System.FormatException: The JSON value is not in a supported DateTime format.। देखें dotnetfiddle.net/GU3R41। असली मुद्दा यह है कि StartDate ISO 8601-1:2019 प्रारूप प्रारूप में नहीं है। आपको उस डेटाटाइम प्रारूप के लिए एक कस्टम कनवर्टर लिखना होगा, देखें System.Text.Json में डेटटाइम और डेटटाइम ऑफसेट सपोर्ट।
 – 
dbc
2 फरवरी 2021, 21:10

1 उत्तर

सबसे बढ़िया उत्तर

आपकी StartDate और EndDate प्रॉपर्टी ISO 8601-1:2019 प्रारूप, जो "Tue, 02 Feb 2021 18:07:33 GMT" के बजाय "2021-02-02T18:07:33Z" जैसा दिखेगा। System.Text में DateTime और DateTimeOffset समर्थन से। जेसन:

JsonSerializer, Utf8JsonReader, Utf8JsonWriter, और JsonElement आईएसओ ८६०१-१:२०१९ प्रारूप के विस्तारित प्रोफाइल के अनुसार डेटटाइम और डेटटाइम ऑफसेट टेक्स्ट प्रस्तुतीकरण को पार्स और लिखते हैं; उदाहरण के लिए, 2019-07-26T16:59:57-05:00।
...
डिफ़ॉल्ट विकल्पों के साथ, इनपुट डेटटाइम और डेटटाइम ऑफसेट टेक्स्ट प्रस्तुतिकरण विस्तारित आईएसओ 8601-1:2019 प्रोफाइल के अनुरूप होना चाहिए। प्रोफ़ाइल के अनुरूप नहीं होने वाले अभ्यावेदन को deserialize करने का प्रयास करने से JsonSerializer एक JsonException को फेंक देगा।

इस प्रकार आपको DateTimeConverterUsingDateTimeParse की तर्ज पर एक कस्टम JsonConverter<DateTime?> बनाना होगा जिसे Microsoft डेटटाइम और डेटटाइम ऑफसेट के लिए कस्टम समर्थन जैसे:

public class CustomDateTimeConverter : JsonConverter<DateTime?>
{
    //const string Format = "Tue, 02 Feb 2021 18:07:33 GMT";
    const string Format = "dddd, dd MMM yyyy hh:mm:ss";

    // Adapted from https://docs.microsoft.com/en-us/dotnet/standard/datetime/system-text-json-support#using-datetimeoffsetparse-and-datetimeoffsettostring
    public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
        DateTime.Parse(reader.GetString(), CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

    public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options) =>
        writer.WriteStringValue(value?.ToUniversalTime().ToString(Format, CultureInfo.InvariantCulture)+" GMT");
}

फिर आप कन्वर्टर को JsonSerializerOptions.Converters या इसे सीधे मॉडल पर इस तरह लागू करें:

public class FilingSearchCriteria
{
    public int? FilerId { get; set; }
    public int? TypeId { get; set; }

    [JsonConverter(typeof(CustomDateTimeConverter))]
    public DateTime? StartDate { get; set; }
    [JsonConverter(typeof(CustomDateTimeConverter))]
    public DateTime? EndDate { get; set; }
    // Remainder unchanged

टिप्पणियाँ:

  • System.Text.Json को विशिष्ट JsonConverter<T> कन्वर्टर्स DateTime? और DateTime के लिए -- और आम तौर पर अशक्त और उनके अंतर्निहित प्रकारों के लिए।

  • DateTime.Parse() स्पष्ट रूप से पार्सिंग का समर्थन नहीं करता है एकाधिक नाम समय क्षेत्र इसलिए यदि आप DateTime स्ट्रिंग्स प्राप्त कर रहे हैं विभिन्न समय क्षेत्रों का मिश्रण, जैसे "GMT" और "EDT", आपको एक अधिक जटिल कनवर्टर लिखने की आवश्यकता होगी।

  • मेरा कनवर्टर मानता है कि आप चाहते हैं कि आपकी तिथियां और समय सार्वभौमिक में समायोजित हो जाएं। आप इसे संशोधित कर सकते हैं यदि यह वांछित नहीं है।

डेमो फिडल यहां

0
dbc 2 फरवरी 2021, 22:07
1
मैंने जेएसओएन पक्ष पर आईएसओ होने के लिए तिथियां उत्पन्न करने के तरीके को अभी बदल दिया है और अब आपकी पहेली काम करती है। इश्यू बिल्ट इन नेट कोर डिसेरिएलाइज़ेशन अभी भी नहीं है। मैंने एक अलग प्रश्न शुरू किया क्योंकि मुझे लगता है कि कुछ और चल रहा है। stackoverflow.com/ प्रश्न/66015759/…
 – 
americanslon
2 फरवरी 2021, 22:07
- ठीक है। यह उत्तर इस प्रश्न के लिए न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण में दिखाए गए मुद्दे को संबोधित करता है, इसलिए एक अलग a href="https://stackoverflow.com/help/minimal-reproducible-example">न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण एक अच्छा विचार है।
 – 
dbc
2 फरवरी 2021, 22:18