close
دانلود آهنگ جدید
استفاده کردن از Async JSON Deserialization با NewtonSoft

یک توسعه دهنده .Net

استفاده کردن از Async JSON Deserialization با NewtonSoft

web api,web api consumption,

من امروز داشتم از web api در زامارین استفاده میکردم میخواستم اطلاعاتی را که از web api  می خوانم را به Task<List<T>> تبدیل کنم که به مشکل بر میخوردم تا اینکه چند نکته یافتم اول بگذارید ببینم چی نوشته بودم، کد من این بود: public async Task<IEnumerable<T>> FindAllAsync()        {            try            {                using (HttpClient client…

استفاده کردن از Async JSON Deserialization با NewtonSoft

استفاده کردن از Async JSON Deserialization  با NewtonSoft 220

من امروز داشتم از web api در زامارین استفاده میکردم میخواستم اطلاعاتی را که از web api  می خوانم را به Task<List<T>> تبدیل کنم که به مشکل بر میخوردم تا اینکه چند نکته یافتم


اول بگذارید ببینم چی نوشته بودم، کد من این بود:




 public async Task<IEnumerable<T>> FindAllAsync()

        {

            try

            {

                using (HttpClient client = new HttpClient())

                {

                    string apiControllerUrl = ApiUrl + "/api/" + typeof(T).Name;


                    string jsonResult = await client.GetStringAsync(apiControllerUrl);

                    var result = await JsonConvert.DeserializeObject<Task<IEnumerable<T>>>(jsonResult) ;

                    return  result;

                }

            }

            catch (Exception e)

            {

                Console.WriteLine(e);

                throw;

            }



        }


کدی که نوشته بودم در قسمت Deserialized کردن خطا میداد میگفت Array  نمی تواند بهTask<IEnumerable<T>> تبدیل شود(چون آرایه از اشیا به صورت json فرستادم و newtonsoft آنها رو تبدیل به آرایه میکند). پس ار کلی تحقیق! فهمیدم که در کد من 2 اشتباه وجود دارد.

اشتباه اول که خطا میگه array  نمیتواند IEnumerable<t>  باشد ! چرا ؟ چون در array نوع none-generic پیاده سازی شده (یعنی در آرایه IEnumrable پیاده سازی کرده ولی من داشتم به IEnumrable<T> تبدلی میکردم ) برایرفع این مشکل از لیست استفاده کردم.

و اشکال بعدی این بود که می خواستم به Task<T> تبدیلش کنم ! برای رفع این مشکل باید مرحله Deserialize  کردن را درون Task  می نوشتم و نه نوع آن را !

یعنی این قسمت


var result = await JsonConvert.DeserializeObject<Task<IEnumerable<T>>>(jsonResult) ;


باید اینطوری مینوشتم


var result = await Task.Run(()=>JsonConvert.DeserializeObject<List<T>>(jsonResult)) ;


و درست هم هست چون Task یک نخ از Thread Pool  هست ! و Deserialize  کردن نمیتونه json را به Task  تبدیل کند !


پس کد اصلاح شده من شد:



  public async Task<List<T>> FindAllAsync()

        {

            try

            {

                using (HttpClient client = new HttpClient())

                {

                    string apiControllerUrl = ApiUrl + "/api/" + typeof(T).Name;


                    string jsonResult = await client.GetStringAsync(apiControllerUrl);

                    var result = await Task.Run(()=>JsonConvert.DeserializeObject<List<T>>(jsonResult)) ;

                    return  result;

                }

            }

            catch (Exception e)

            {

                Console.WriteLine(e);

                throw;

            }



        }



پس بطور خلاصه میشه استفاده از List<T> به جای IEnumerable<T>  و قرار دادن Deserialize  در Task.Run