문제

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

이것은 나를 위해 작동합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top