我正在使用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
}
]
}
}
在documentation中,我读到了这一点 最小化内存使用量和分配的对象数量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);
WAY 2(好的方法。我通过StreamReader读取。在线var 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);
WAY 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);
所以我的问题。我想继续第三种方式。但有没有办法为JsonSerializer设置一些处理程序作为MyDateTimeConverter来自动转换它?
答案 0 :(得分:2)
您可以将MyDateTimeConverter
添加到Converters
上的JsonSerializer
集合中;应该允许您使用第三种方法而不会出错。
var serializer = new JsonSerializer();
serializer.Converters.Add(new MyDateTimeConverter());
result = serializer.Deserialize<BillsList>(reader);
答案 1 :(得分:2)
您可以在初始化应用时设置默认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);