Newtonsoft의 JSON Serializer에서 JSON DATETIME PARSING
문제
NewTonsoft의 JSON Serializer를 사용하여 객체를 직렬화했으며 DateTime은 다음과 같습니다.
/Date(1237588418563+0000)/
i $ .evaljson ()이 객체이지만 ToutCstring과 같은 일반적인 날짜 방법을 찾을 수 없습니다.
내가 이것으로 할 수있는 일이 있습니까?
해결책
더 나은 형식을 얻기 위해 날짜와 함께 작업하기 위해 JSON.NET과 함께 제공되는 JSONCONVERTER 중 하나를 사용하십시오. JavaScriptDateTimeConverter는 자동으로 JavaScript 날짜를 제공합니다.
public class LogEntry
{
public string Details { get; set; }
public DateTime LogDate { get; set; }
}
[Test]
public void WriteJsonDates()
{
LogEntry entry = new LogEntry
{
LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),
Details = "Application started."
};
string defaultJson = JsonConvert.SerializeObject(entry);
// {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"}
string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());
// {"Details":"Application started.","LogDate":new Date(1234656000000)}
string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter());
// {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}
}
선적 서류 비치: JSON.NET를 사용한 JSON의 직렬화 날짜
다른 팁
나는 일부에게 유용 할 수있는 다른 접근법을 생각해 냈습니다. 기본적으로 나는 내 자신을 만듭니다 CustomDateConverter 내가 필요할 때 전화를 걸었습니다. 변환기는 2 개의 매개 변수, 날짜 형식 예를 들어 yyyy-MM-dd HH:mm:ss
그리고 TimezoneInfo, 날짜를 UTC에서 사용자의 시간대로 변환 할 수 있습니다.
public class JSONCustomDateConverter : DateTimeConverterBase
{
private TimeZoneInfo _timeZoneInfo;
private string _dateFormat;
public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo)
{
_dateFormat = dateFormat;
_timeZoneInfo = timeZoneInfo;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(DateTime);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat));
writer.Flush();
}
다음과 같이 사용할 수 있습니다.
var jsonString = JsonConvert.SerializeObject(myObject, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = new List<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });
사용자 정의 날짜 서식 만 원한다면 시간대와 관련된 것을 제거 할 수 있습니다. 도움이 된 것을 알려주세요!
NewTonsoft JSON.NET 버전 4.5R5는 JSONPropertyAttribute 클래스 클래스를 사용하고 ItemConverterType 속성 속성을 설정합니다. 용법:
// class to be serialized
public class MyClass
{
[JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]
public DateTime? DateTime1;
public DateTime? DateTime2;
}
내가 관찰 한 바와 같이, 이것은이 클래스의 모든 속성에 대한 DateTimeConverter를 설정하여 이전에 선언 된 것뿐만 아니라이 클래스의 모든 속성에 대해 설정할 것입니다.
동일한 문제에 부딪쳐 Adam의 링크를 기반으로 솔루션을 찾았습니다.
new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0));
JavaScript가 Date 객체로 쉽게 변환 할 수있는 Unix 타임 스탬프처럼 보입니다. 그만큼 - 0
JavaScript를 취급하는 것입니다 substr
정수로서의 출력 ... 할 수있을 것 같아요 Number()
당신이 외모를 좋아하지 않는다면 - 0
JSON 객체에는 다음과 같은 내용이 포함되어 있습니다.
var data = {"CreatedDate":"/Date(1327572000000-1000)/"});
///
var oddDateTimeZone = data.CreatedDate;
var utcDateTime = oddDateTimeZone.substr(oddDateTimeZone.indexOf("(")+1, 13);
var utcZone = oddDateTimeZone.substr(oddDateTimeZone.indexOf("-")+1, 4);
var utcDateTimeZone = new Date(Number(utcDateTime)-(Number(utcZone)));
그러나 여전히 JSON 객체를 고정하여 eval () 또는 Window []와 같은 것을 사용하지 않고 날짜 기능을 발사하는 것이 좋습니다. 어쩌면 jQuery에서. 확실하지 않다.
오프셋이 될 수 있다는 것을 잊지 마십시오 +
그리고 단지 -
오프셋을 위해!
미안해 @James Newton-King을 단순화합니다
string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
이것은 나를 위해 작동합니다