Json.net从HTTPClient结果反序列化DateTime

本文关键字:反序列化 DateTime 结果 HTTPClient net Json | 更新日期: 2023-09-27 18:29:43

我正在使用HTTPCLient调用RestFul服务。分析DateTime时出现问题。因为在我的类中,我有DateTime属性。在Json中是类型。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支持直接对流进行序列化和反序列化

因此=>

WAY 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(好方法。我通过行var rTS=sr.ReadToEnd()中的StreamReader.Bu读取;它会创建新的字符串。这不好。因为我使用了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);

WAY3(最好的。但如果属性是我类中的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);

所以我的问题。我想继续第三条路。但是有没有办法为JsonSerializer设置一些处理程序作为MyDateTimeConverter来自动转换它?

Json.net从HTTPClient结果反序列化DateTime

您可以在应用程序初始化时设置默认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); 

您可以将MyDateTimeConverter添加到JsonSerializer上的Converters集合中;这应该允许您使用第三种方法而不会出现错误。

    var serializer = new JsonSerializer();
    serializer.Converters.Add(new MyDateTimeConverter());
    result = serializer.Deserialize<BillsList>(reader);