मैं JsonSerializer वर्ग की DeserializeAsync विधि का उपयोग करके अपने JSON को डिसेरिएलाइज़ करने के लिए Utf8 json लाइब्रेरी का उपयोग कर रहा हूं। और कभी-कभी मैं देख रहा हूं कि यह अपवाद फेंक रहा है -

Arithmetic operation resulted in an overflow.

तो ऐसा लगता है कि मेरे JSON डेटा का एक मान है जो हमारे ऑब्जेक्ट के गुणों में से किसी एक में फिट होने के लिए बहुत बड़ा है, जिससे यह अतिप्रवाह अपवाद होता है। नीचे वह कोड है जो मुझे मिला है जहां मैं जेसन को मुद्रित करने का प्रयास कर रहा हूं जो खराब है और यह Arithmetic Overflow त्रुटि उत्पन्न कर रहा है लेकिन जब भी यह अपवाद होता है तो यह JSON लॉगिंग नहीं कर रहा है।

using (var content = httpResponseMessage.Content)
{
    if (content == null) return (default(T), statusCode);

    using (var responseStream = await httpResponseMessage.Content.ReadAsStreamAsync())
    {
        try
        {
            deserializedValue = await JsonSerializer.DeserializeAsync<T>(responseStream, formatResolver);
        }
        catch (Exception ex)
        {
            var bodyString = (ex as JsonParsingException)?.GetUnderlyingByteArrayUnsafe();
            var error = (bodyString != null) ? $"Bad json: {Encoding.UTF8.GetString(bodyString)}" : "Cannot Deserialize JSON";
            logger.logError(error, ex.Message, "Deserialization Exception", ex.StackTrace, (int)statusCode);
            return (default(T), HttpStatusCode.BadRequest);
        }
    }
}

किसी कारण से bodyString शून्य के रूप में आ रहा है जब भी यह अपवाद होता है और इसलिए JSON बॉडी प्राप्त करने के लिए मेरी स्थिति का मूल्यांकन नहीं किया जा रहा है। मेरी समझ यह थी कि यह JsonParsingException फेंक देगा लेकिन ऐसा लगता है कि यह कोई अन्य अपवाद फेंक रहा है।

क्या यह अपवाद होने पर JSON बॉडी प्राप्त करने का कोई तरीका है? या जब भी यह अपवाद कुशलतापूर्वक होता है तो JSON प्राप्त करने के लिए इसे बेहतर तरीके से लिख सकते हैं?

1
AndyP 10 नवम्बर 2020, 22:25

1 उत्तर

सबसे बढ़िया उत्तर
  1. आपने लिखा है कि आपको "अंकगणित अतिप्रवाह" त्रुटि मिली है, इसलिए कैच में वास्तविक प्रकार का अपवाद शायद OverflowException है, JsonParsingException नहीं

  2. मुझे लगता है कि आपको responseStream से bodyString मिलना चाहिए। आप स्ट्रीम को responseStream.Position = 0 के साथ रीसेट कर सकते हैं और इससे बॉडी को बाइट ऐरे के रूप में पढ़ सकते हैं।

1
GoodboY 10 नवम्बर 2020, 20:03