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

Posted

技术标签:

【中文标题】Json.net 从 HTTPClient 结果反序列化 DateTime【英文标题】:Json.net deserialize DateTime from HTTPClient result 【发布时间】:2014-11-07 10:31:31 【问题描述】:

我正在使用 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
      
    ]
  

在documentation 我读到了 为了最小化内存使用和分配的对象数量,Json.NET 支持直接序列化和反序列化到流。

所以 =>

方式 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);

WAY 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);

所以我的问题。我想继续使用第三种方式。但是有没有办法将一些处理程序设置为 MyDateTimeConverter 以便 JsonSerializer 自动转换它?

【问题讨论】:

看看这里:***.com/questions/21256132/… 是的,但是正如您看到的这个示例就像我的第二个示例一样。我不想在将它作为 Stream 读取后创建字符串对象。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

这是我需要的。我不知道如何将转换器添加到 JsonSerializer。谢谢... 没问题;很高兴我能帮上忙。

以上是关于Json.net 从 HTTPClient 结果反序列化 DateTime的主要内容,如果未能解决你的问题,请参考以下文章

Json.NET - 直接从流反序列化为动态?

WPF - Json.NET:如何从 Json 反序列化多个对象并将其放入列表中?

使用 Json.net 将 JSON 对象反序列化为动态对象

.NET Core - Json.NET反序列化映射

使用 Json.NET 反序列化复杂对象

Json.Net以索引为名称反序列化JSON对象[重复]