在ASP.NET WebApi中:我有一个DTO类:
public class DTO
{
public string Date {get; set;}
}
当客户端(Internet Explorer插件)从此WebApi请求数据时,我返回IEnumerable<DTO>
,如下所示:
return Request.CreateResponse(System.Net.HttpStatusCode.OK, dtoObject)
dtoObject
的类型为IEnumerable<DTO>
。在调试时,我检查dtoObject[0].Date
的值,它显示22-Nov-18 12:00:00 AM
,这是预期的值。
在Internet Explorer插件中:我有一个名为Model
的模型类:
public class Model
{
public string Date {get; set;}
}
我要求WebApi像这样:
var response = await httpClient.PostAsJsonAsync(serviceUrl, requestDto);
var returnJson = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<IEnumerable<Model>>(returnJson)
现在,当我检查result[0].Date
我得到,12/11/2018 12:00:00 AM
,而我期待22-Nov-18 12:00:00 AM
我已经读过,不同的库/语言对日期值进行了不同的序列化。但是,我使用string
存储值,那么为什么值会发生变化?我希望以Date
格式接收dd-MMM-yy hh:mm:ss tt
值。我如何实现这一目标?
所述问题无法在以下测试中复制。
序列化DTO
然后反序列化Model
的单元测试表现如预期
[Test]
public void __String_Dates_Should_Match() {
//Arrange
var date = "22-Nov-18 12:00:00 AM";
var dtoObject = new[] { new DTO { Date = date } };
var returnJson = JsonConvert.SerializeObject(dtoObject);
//Act
var result = JsonConvert.DeserializeObject<IEnumerable<Model>>(returnJson);
//Assert
result.First()
.Should().NotBeNull()
.And.Match<Model>(_ => _.Date == date);
}
使用内存中Web API的集成测试也可以按预期运行
[TestClass]
public class MyTestClass {
[Test]
public async Task __WebApi_Dates_Should_Match() {
//Arrange
var date = "22-Nov-18 12:00:00 AM";
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
var httpServer = new HttpServer(config);
var client = new HttpClient(httpServer);
//Act
var response = await client.GetAsync("http://localhost/api/test/data");
var returnJson = await response.Content.ReadAsStringAsync();
//Assert
response.IsSuccessStatusCode.Should().BeTrue();
var result = JsonConvert.DeserializeObject<IEnumerable<Model>>(returnJson);
result.First()
.Should().NotBeNull()
.And.Match<Model>(_ => _.Date == date);
}
}
[RoutePrefix("api/test")]
public class TestApiController : ApiController {
[HttpGet]
[Route("data")]
public IHttpActionResult Get() {
var date = "22-Nov-18 12:00:00 AM";
var dtoObject = new[] { new DTO { Date = date } };
return Ok(dtoObject);
}
}
鉴于指定的属性是字符串,它们不应受日期转换的影响。
那么问题就是你如何将DateTime
分配给属性。这可能是代码运行的当前文化的结果。
var value = new DTO {
Date = someDateTime.ToString()
};
这是应该应用所需日期格式的地方
var value = new DTO {
Date = someDateTime.ToString("dd-MMM-yyyy hh:mm:ss tt")
};
尝试在Web API配置中使用ISO-8601 DateTime格式以获得一致的日期格式:
JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new IsoDateTimeConverter());
GlobalConfiguration.Configuration.Formatters[0] = new JsonNetFormatter(serializerSettings);
日期将返回为:
{
"Date": "2018-11-20T12:16:00"
}
在您的客户端中,在将JSON反序列化为内部对象时,需要使用相同的格式。