【发布时间】:2026-01-07 07:40:02
【问题描述】:
我正在使用 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 自动转换它?
【问题讨论】:
-
是的,但是正如您看到的这个示例就像我的第二个示例一样。我不想在将它作为 Stream 读取后创建字符串对象。
标签: c# json json.net httpclient dotnet-httpclient