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. Bu в строке 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
Да, но, как вы видите, этот образец похож на мой второй образец. Где я не хочу создавать строковый объект после его чтения как Stream.   -  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
Это то, что мне было нужно. я не знал, как добавить Convertor в 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