ASP.NET Web API를 사용하여 일부 데이터를 노출하는 API를 개발 중입니다.
API 중 하나에서 클라이언트는 날짜를 yyyy-MM-dd형식으로 노출하기를 원합니다 . 전역 설정 (예 🙂 GlobalConfiguration.Configuration.Formatters.JsonFormatter은이 클라이언트에만 적용되므로 변경하고 싶지 않습니다 . 그리고 여러 고객을위한 솔루션으로 개발하고 있습니다.
내가 생각할 수있는 해결책 중 하나는 사용자 지정 JsonConverter을 만든 다음 사용자 지정 서식을 지정 해야하는 속성에 넣는 것입니다.
예 :
class ReturnObjectA
{
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime ReturnDate { get;set;}
}
다른 쉬운 방법이 있는지 궁금합니다.
답변
당신은 올바른 길을 가고 있습니다. 전역 설정을 수정할 수 없다고 말 했으므로 다음으로 가장 좋은 방법은 JsonConverter제안한대로 필요에 따라 속성 을 적용하는 것입니다 . Json.Net에는 이미 IsoDateTimeConverter날짜 형식을 지정할 수 있는 내장 기능 이 있습니다. 불행히도 JsonConverter속성의 유일한 인수는 유형이므로 속성을 통해 형식을 설정할 수 없습니다 . 그러나 간단한 해결책이 있습니다. subclass the IsoDateTimeConverter다음 서브 클래스 생성자에서 날짜 형식을 지정하십시오. JsonConverter사용자 지정 변환기를 지정하여 필요한 곳에 특성을 적용하면 준비가 완료됩니다. 필요한 코드 전체는 다음과 같습니다.
class CustomDateTimeConverter : IsoDateTimeConverter
{
public CustomDateTimeConverter()
{
base.DateTimeFormat = "yyyy-MM-dd";
}
}
거기에 시간이 없어도 IsoDateTimeConverter를 서브 클래스로 만들 필요조차 없습니다. 기본 날짜 형식은 소스 코드yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK 에서 볼 수 있습니다.
답변
이 방법을 사용할 수 있습니다.
public class DateFormatConverter : IsoDateTimeConverter
{
public DateFormatConverter(string format)
{
DateTimeFormat = format;
}
}
그리고 이런 식으로 사용하십시오 :
class ReturnObjectA
{
[JsonConverter(typeof(DateFormatConverter), "yyyy-MM-dd")]
public DateTime ReturnDate { get;set;}
}
DateTimeFormat 문자열은 여기에 설명 된 .NET 형식 문자열 구문을 사용합니다. https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
답변
IsoDateTimeConverter전역 서식 설정을 변경하지 않고 인스턴스를 사용하여 수행 할 수도 있습니다 .
string json = JsonConvert.SerializeObject(yourObject,
new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });
인수 JsonConvert.SerializeObject를 취하는 오버로드를 사용합니다 params JsonConverter[].
답변
직렬 변환기 설정 과부하 중 하나를 사용하여 사용할 수도 있습니다.
var json = JsonConvert.SerializeObject(someObject, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" });
또는
var json = JsonConvert.SerializeObject(someObject, Formatting.Indented, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" });
타입을 사용하는 과부하도 가능합니다.
답변
헬퍼 클래스를 빌드하고 속성 속성에 적용
헬퍼 클래스 :
public class ESDateTimeConverter : IsoDateTimeConverter
{
public ESDateTimeConverter()
{
base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffZ";
}
}
코드는 다음과 같이 사용됩니다.
[JsonConverter(typeof(ESDateTimeConverter))]
public DateTime timestamp { get; set; }
답변
내가 사용한 다른 솔루션이 있습니다. 문자열 속성을 만들고 json에 사용하십시오. 이 속성은 올바른 형식의 날짜를 반환합니다.
class JSonModel {
...
[JsonProperty("date")]
public string MyDate { get; set; }
public string CustomDate {
get { return MyDate.ToString("DDMMYY"); }
set { MyDate = DateTime.Parse(value); }
}
...
}
이런 식으로 추가 클래스를 만들 필요가 없습니다. 또한 다른 데이터 형식을 만들 수 있습니다. 예를 들어, 동일한 DateTime을 사용하여 시간에 대한 다른 속성을 쉽게 만들 수 있습니다.
답변
때때로 json convert 속성을 꾸미는 것은 효과가 없을 것입니다. ” 2010-10-01″이 유효한 날짜라는 예외를 통해 처리 할 것 입니다. 이 유형을 피하기 위해 속성에서 json convert 속성을 제거하고 아래처럼 deserilizedObject 메소드에서 언급했습니다.
var addresss = JsonConvert.DeserializeObject<AddressHistory>(address, new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" });
