[英]replace a JSON date in a string to a more readable date
我们想向正在测试我们的应用程序的用户展示一些JSON。 所以我们在ASP.NET代码隐藏文件中调用我们的REST服务并返回一个包含大量JSON的字符串。
然后我们将它放在页面中的PRE元素中,调用beautify来创建可读的JSON并且一切都很好:显示了一些人类可读的内容。
好但是一件事:所有日期都以正常的JSON格式显示,如“/ Date(1319266795390 + 0800)/”
我想要做的是用JSON(C#)字符串中的'普通'日期替换那些JSON日期,所以在后面的代码中,在我将字符串添加到PRE元素之前。
我在考虑一些正则表达式,但我无法弄清楚如何......
我一直在处理JSON字符串中的日期已有一段时间了, 没有标准的方法 ,这就是为什么有这么多不同的方法来做到这一点! 如果JSON规范可以首先为日期指定标准格式,那可能会更好!
微软正在以自己的方式做到这一点,自1970年以来以UTC格式计算msecs,就像"/Date(1319266795390+0800)/"
自从在ASP.Net JavaScriptSerializer
输出之上使用正则表达式以来,我们一直在将上面的字符串更改为ISO-8601格式 。 这是一个W3C标准, 人类可读和大多数浏览器序列化日期到字符串的方式,这里是如何:
static readonly long DATE1970_TICKS = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks;
static readonly Regex DATE_SERIALIZATION_REGEX = new Regex(@"\\/Date\((?<ticks>-?\d+)\)\\/", RegexOptions.Compiled);
static string ISO8601Serialization(string input)
{
return DATE_SERIALIZATION_REGEX.Replace(input, match =>
{
var ticks = long.Parse(match.Groups["ticks"].Value) * 10000;
return new DateTime(ticks + DATE1970_TICKS).ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss.fff");
});
}
您可以轻松更改格式以满足您的需求,查看自定义日期和时间格式, 请查看MSDN文章
以下是它的使用方法:
JavaScriptSerializer ser = new JavaScriptSerializer();
var JsonSrt = ISO8601Serialization(ser.Serialize(DateTime.Now)); // "\"2012-05-09T14:51:38.333\""
更新:
可以使用Regex将JavaScript中服务器返回的JSON字符串调整为更易读的形式:
var str = "/Date(1319266795390+0800)/";
str.replace(/\/Date\((\d+)\+\d+\)\//, function (str, date) {
return new Date(Number(date)).toString();
});
解决方案位于问题中显示的字符串中。 JavaScript Date对象将解析该格式并生成可读版本,因此Date(1319266795390+0800)
返回“Wed Apr 18 2012 08:13:22 GMT-0500(Central Daylight Time)”。
要从字符串中删除正斜杠,可以使用带有正则表达式的replace函数: "/Date(1319266795390+0800)/".replace(/\\//g, '')
。 "/Date(1319266795390+0800)/".replace(/\\//g, '')
。
你可以用这个:
string date = "/Date(1319266795390+0800)/";
string regex = @"/Date\((.*?)\+(.*?)\)/";
Match match = Regex.Match(date, regex);
DateTime d = new DateTime(1970, 01, 01).AddMilliseconds(long.Parse(match.Result("$1")));
假设您要序列化的类如下所示:
public class Something
{
public int ID;
public string Name;
public DateTime Date;
}
将其更改为:
public class Something
{
public int ID;
public string Name;
public DateTime Date;
public string HumanReadableDate { get { return Date.ToLongDateString(); } }
}
或者,如果您希望仅在测试环境中显示该额外属性:
public class Something
{
public int ID;
public string Name;
public DateTime Date;
#if DEBUG
public string HumanReadableDate { get { return Date.ToLongDateString(); } }
#endif
}
也可以使用.ToLongDateString()
.ToString("yyyy-MM-dd HH:mm")
或任何其他格式代替.ToLongDateString()
用作正则表达式:
(?<= /Date\( )
(?<ticks>[0-9]+)
((?<zonesign>[+-])
(?<zonehour>[0-9]{2})
(?<zoneminutes>[0-9]{2})
)?
(?= \)/ )
这将匹配/Date(1319266795390+0800)/
的括号内的部分。 然后,您可以在整个JSON字符串上调用Regex.Replace
,以使用格式良好的DateTime
替换数字:
使用匹配评估程序委托中获得的Match
对象,并提取ticks,zoneign,zonehour和zoneminutes部分,将其转换为整数。
然后将javascript刻度转换为.NET刻度(应为* 10000),从刻度中构造.NET DateTime
并添加/减去时区的小时和分钟。 将DateTime
转换为字符串并将其作为替换返回。
如果您的JSON是.NET类的序列化表示,也许您可以使用DataContractJsonSerializer
在服务器上对其进行反序列化,或者如果您不需要通用的解决方案来处理,可能只需为JSON对象定义存根类多个数据集:
string json = "{\"Test\": \"This is the content\"}";
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(TestJson));
var deserialisedContent = ds.ReadObject(new MemoryStream(Encoding.ASCII.GetBytes(json)));
foreach (var field in typeof (TestJson).GetFields())
{
Console.WriteLine("{0}:{1}", field.Name, field.GetValue(deserialisedContent));
}
...
[DataContract]
private class TestJson
{
[DataMember]
public string Test;
}
使用Newtonsoft.JSON。 您可以为每种类型提供自己的序列化程序,并根据需要序列化日期。
创建一个字符串属性,例如我在这里定义的dateofbirth,并将你的datetime变量返回为:
public string DateOfBirthString
{
get { return DateOfBirth.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss"); }
set { DateOfBirth = string.IsNullOrEmpty(value) ? new DateTime(1900, 1, 1) : Convert.ToDateTime(value); }
}
因为这将返回字符串,所以它在客户端是相同的,所以从用户那里获取字符串dateTime并转换它。
string input = [yourjsonstring];
MatchEvaluator me = new MatchEvaluator(MTListServicePage.MatchDate);
string json = Regex.Replace(input, "\\\\/\\Date[(](-?\\d+)[)]\\\\/", me, RegexOptions.None)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.