IT

Newtonsoft의 JSON Serializer에서 JSON DateTime 해석

itgroup 2023. 2. 14. 20:10
반응형

Newtonsoft의 JSON Serializer에서 JSON DateTime 해석

Newtonsoft의 JSON 시리얼라이저를 사용하여 객체를 시리얼화했는데 Date Time은 다음과 같습니다.

/Date(1237588418563+0000)/

$.evalJSON()을 사용하면 오브젝트이지만 toUTCtring과 같은 일반적인 Date 메서드를 찾을 수 없습니다.

이걸로 뭘 할 수 있을지 생각나는 거 없어?

Json과 함께 제공되는 JsonConverter 중 하나를 사용합니다.더 나은 형식을 얻기 위해 날짜 작업을 위한 NET.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에서 JSON과 함께 날짜 일련화.네트워크

나는 몇몇 사람들에게 유용할 수 있는 다른 접근법을 생각해냈다.기본적으로는 필요에 따라 호출하는 독자적인 CustomDateConverter를 만듭니다.변환기는 날짜 형식(예: 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) } });

커스텀 날짜 형식만 원하는 경우 표준시와 관련된 모든 항목을 삭제할 수 있습니다.도움이 됐는지 알려주세요!

뉴턴소프트 존슨에 대해서요넷 버전 4.5r5에서는 JsonPropertyAttribute Class 클래스를 사용하고 해당 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는 날짜 객체로 쉽게 변환할 수 있는 Unix 타임스탬프처럼 보입니다.- 0javascript를 단순히 처리하도록 하는 것입니다.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);

난 이거면 돼

언급URL : https://stackoverflow.com/questions/668488/parsing-json-datetime-from-newtonsofts-json-serializer

반응형