Json.net десериализира DateTime от резултата на HTTPClient

Използвам HTTPCLient за извикване на услугата RestFul. Моят проблем при анализиране на DateTime. Тъй като в моя клас имам свойство DateTime. Което в Json е тип long. Json ключът е: exp

{
  "resultCodes": "OK",
  "description": "OK",
  "pans": {
    "maskedPan": [
      {
        "id": "4b533683-bla-bla-3517",
        "pan": "67*********98",
        "exp": 1446321600000,
        "isDefault": true
      },
      {
        "id": "a3093f00-zurna-01e18a8d4d72",
        "pan": "57*********96",
        "exp": 1554058800000,
        "isDefault": false
      }
    ]
  }
}

В документацията прочетох, че За минимизиране на използването на паметта и броя на обектите разпределен Json.NET поддържа сериализиране и десериализиране директно в поток.

So =>

НАЧИН 1 (Четене чрез GetStringAsync). В документацията пише, че вместо това се използва StreamReader.

return Task.Factory.StartNew(() =>
            {
                var client = new HttpClient(_handler);    
                var url = String.Format(_baseUrl + @"list/{0}", sessionId);    
                BillsList result;    


                var rrrrr = client.GetStringAsync(url).Result;
                result = JsonConvert.DeserializeObject<BillsList>(rrrrr,
                                                   new MyDateTimeConverter());      


                return result;

            }, cancellationToken);

НАЧИН 2 (Добър начин. Четох чрез StreamReader. В ред var rTS = sr.ReadToEnd(); създава нов низ. Не е добре. Тъй като използвах GetStreamAsync, за да избегна създаването на низова променлива.)< /силен>

 return Task.Factory.StartNew(() =>
                {
                    var client = new HttpClient(_handler);    
                    var url = String.Format(_baseUrl + @"list/{0}", sessionId);    
                    BillsList result;    


                    using (var s = client.GetStreamAsync(url).Result)
                    using (var sr = new StreamReader(s))
                    using (JsonReader reader = new JsonTextReader(sr))
                    {  
                        var rTS = sr.ReadToEnd();
                        result = JsonConvert.DeserializeObject<BillsList>(rTS,
                                                  new MyDateTimeConverter()); 
                    }                     

                    return result;

                }, cancellationToken);

НАЧИН 3 (Най-добрият. Но дава изключение, ако свойството е DateTime в моя клас. )

 return Task.Factory.StartNew(() =>
                {
                    var client = new HttpClient(_handler);    
                    var url = String.Format(_baseUrl + @"list/{0}", sessionId);    
                    BillsList result;    


                    using (var s = client.GetStreamAsync(url).Result)
                    using (var sr = new StreamReader(s))
                    using (JsonReader reader = new JsonTextReader(sr))
                    {  
                         var serializer = new JsonSerializer();                  
                         result = serializer.Deserialize<BillsList>(reader); 
                    }                     

                    return result;

                }, cancellationToken);

Та въпросът ми. Искам да продължа с 3-тия начин. Но има ли някакъв начин да зададете някакъв манипулатор като MyDateTimeConverter за JsonSerializer, за да го конвертирате автоматично?


person AEMLoviji    schedule 07.11.2014    source източник
comment
Погледнете тук:stackoverflow.com/questions/21256132/   -  person shrekDeep    schedule 07.11.2014
comment
Да, но както виждате тази проба е като втората ми проба. Когато не искам да създавам низов обект, след като го прочета като поток.   -  person AEMLoviji    schedule 07.11.2014


Отговори (2)


Можете да добавите своя MyDateTimeConverter към колекцията Converters на JsonSerializer; това трябва да ви позволи да използвате третия си подход, без да получавате грешки.

    var serializer = new JsonSerializer();
    serializer.Converters.Add(new MyDateTimeConverter());
    result = serializer.Deserialize<BillsList>(reader);
person Brian Rogers    schedule 07.11.2014
comment
Това е, което ми трябваше. не знаех как да добавя конвертор към JsonSerializer. Благодаря... - person AEMLoviji; 08.11.2014
comment
Няма проблем; радвам се, че мога да помогна. - person Brian Rogers; 08.11.2014

Можете да настроите JsonSerializerSettings по подразбиране, когато приложението ви се инициализира:

        // This needs to be done only once, so put it in an appropriate static initializer.
        JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            Converters = new List<JsonConverter> { new MyDateTimeConverter() }
        };

След това по-късно можете да използвате JsonSerializer.CreateDefault

        JsonSerializer serializer = JsonSerializer.CreateDefault();
        result = serializer.Deserialize<BillsList>(reader); 
person dbc    schedule 08.11.2014