【发布时间】:2010-10-14 16:28:17
【问题描述】:
我已经使用 Newtonsoft 的 JSON 序列化器序列化了一个对象,并且 DateTime 已经通过:
/Date(1237588418563+0000)/
当我对其进行 $.evalJSON() 时,它是一个对象,但我在其上找不到任何正常的 Date 方法,例如 toUTCString。
任何想法我可以用这个做什么?
【问题讨论】:
标签: json datetime parsing json.net
我已经使用 Newtonsoft 的 JSON 序列化器序列化了一个对象,并且 DateTime 已经通过:
/Date(1237588418563+0000)/
当我对其进行 $.evalJSON() 时,它是一个对象,但我在其上找不到任何正常的 Date 方法,例如 toUTCString。
任何想法我可以用这个做什么?
【问题讨论】:
标签: json datetime parsing json.net
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
这对我有用
【讨论】:
ObjectMapper 到底是什么?
遇到了同样的问题,并根据 Adam 的链接找到了解决方案:
new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0));
它看起来像一个 Unix 时间戳,javascript 可以很容易地将其转换为日期对象。 - 0 只是让 javascript 将 substr 输出视为整数......我想你也可以 Number() 它,如果你不喜欢 - 0 的外观
【讨论】:
对不起,我简化了一点@James Newton-King
string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);
【讨论】:
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 中。不确定。
不要忘记偏移量可以是+,而不仅仅是-!
【讨论】:
eval("new " + data.CreateDate.replace(/\//ig,"")) 似乎工作得很好
我想出了一种可能对某些人有用的不同方法。基本上我创建了我自己的 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) } });
如果您只想要自定义日期格式,显然您可以删除任何与时区相关的内容。让我知道这有帮助!
【讨论】:
services.AddMvc() .AddJsonOptions(jsonOption => { jsonOption.SerializerSettings.Converters.Add( new JSONCustomDateConverter("dd/mm/yyy", TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"))); });
使用 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"}
}
【讨论】:
从 Newtonsoft Json.Net 4.5r5 版开始,您使用 JsonPropertyAttribute Class 类并设置其 ItemConverterType Property 属性。 用法:
// class to be serialized
public class MyClass
{
[JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]
public DateTime? DateTime1;
public DateTime? DateTime2;
}
正如我所观察到的,这将为此类中的所有属性设置 DateTimeConverter,而不仅仅是之前声明的属性。
【讨论】: