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" });
