在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
值。我该如何实现?
答案 0 :(得分:3)
在以下测试中无法重现所陈述的问题。
先对Show More
进行序列化然后对DTO
进行反序列化的单元测试的行为符合预期
Model
使用内存内Web API的集成测试也可以达到预期的效果
[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);
}
鉴于分配的属性是字符串,因此日期转换不会影响它们。
然后的问题是如何将[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()
};
答案 1 :(得分:0)
尝试在WebAPI配置中使用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反序列化为内部对象时,您需要期望使用相同的格式。