繁体   English   中英

将字符串中的JSON日期替换为更易读的日期

[英]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。 您可以为每种类型提供自己的序列化程序,并根据需要序列化日期。

http://james.newtonking.com/projects/json-net.aspx

创建一个字符串属性,例如我在这里定义的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM