Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串中的JSON日期替换为更可读的日期_C#_Regex_Json - Fatal编程技术网

C# 将字符串中的JSON日期替换为更可读的日期

C# 将字符串中的JSON日期替换为更可读的日期,c#,regex,json,C#,Regex,Json,我们希望向正在测试我们的应用程序的用户显示一些JSON。因此,我们在ASP.NET代码隐藏文件中调用REST服务,并返回一个字符串,其中包含大量JSON 然后我们把它放在页面中的一个PRE元素中,调用bestify来创建可读性好的JSON,一切都很好:显示了人类可读的内容 很好,但有一点:所有日期都以正常的JSON格式显示,如“/Date(1319266795390+0800)/” 我想做的是在JSON(C#)字符串中用“正常”日期替换这些JSON日期,因此在后面的代码中,就是在我将字符串添加到

我们希望向正在测试我们的应用程序的用户显示一些JSON。因此,我们在ASP.NET代码隐藏文件中调用REST服务,并返回一个字符串,其中包含大量JSON

然后我们把它放在页面中的一个PRE元素中,调用bestify来创建可读性好的JSON,一切都很好:显示了人类可读的内容

很好,但有一点:所有日期都以正常的JSON格式显示,如“/Date(1319266795390+0800)/”

我想做的是在JSON(C#)字符串中用“正常”日期替换这些JSON日期,因此在后面的代码中,就是在我将字符串添加到PRE元素之前


我在考虑一些正则表达式,但我不知道如何…

解决方案在问题中显示的字符串内。JavaScript日期对象将解析该格式并生成可读版本,因此
Date(1319266795390+0800)
返回“Wed Apr 18 2012 08:13:22 GMT-0500(中央夏令时)”


要从字符串中删除正斜杠,可以使用带有正则表达式的replace函数:
“/Date(1319266795390+0800)/”。replace(//\//g.)

用作正则表达式,类似于:

(?<= /Date\( ) 
  (?<ticks>[0-9]+)
  ((?<zonesign>[+-])
   (?<zonehour>[0-9]{2})
   (?<zoneminutes>[0-9]{2})
  )?
(?= \)/ )

(?如果您的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;
}

我在JSON字符串中处理日期已经有一段时间了,这就是为什么有这么多不同的方法来处理日期的原因!如果JSON规范能够首先指定日期的标准格式,可能会更好

微软正在以自己的方式进行这项工作,以UTC格式计算1970年以来的毫秒数这类似于
“/Date(1319266795390+0800)/”

自从在
ASP.Net JavaScriptSerializer
输出上使用正则表达式以来,我们一直在将上面的字符串更改为。这是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");
    });
}
更新:

还有一种方法可以使用正则表达式将服务器返回的JavaScript JSON字符串调整为更可读的形式:

var str = "/Date(1319266795390+0800)/";
str.replace(/\/Date\((\d+)\+\d+\)\//, function (str, date) {
    return new Date(Number(date)).toString();
});
您可以使用以下选项:

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

使用Newtonsoft.JSON。您可以为每种类型提供自己的序列化程序,并根据需要序列化日期


假设要序列化的类如下所示:

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”)
或任何其他格式

为我在此处定义的示例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并将其转换。

Ah,但我的字符串包含的不仅仅是该日期,它还包含50个其他person属性,其中包括一些日期。Michel-正则表达式本质上是用于从非常长的Eric建议的应该对你有用的东西完全可以用JavaScript来完成。你能在问题的文本中包含更完整的JSON字符串示例吗?你想让它更具“可读性”。问题是,JSON主要用于将对象转换为字符串,以便能够传输到web客户端并将JSON转换回JavaScript对象。JavaScript对象应该不可读。例如,如果您有一个对象数组,该数组的属性中包含日期,则无法使其具有良好的可读性。因此,它很重要t了解哪种数据(哪种对象)您已经序列化为JSON String。您会考虑JavaScript解决方案吗?或者,您是否已经死死地使用Cyz来进行转换?好的解决方案。我们使用WCF框架自动将对象转换为JSON。在代码中,我们只返回一个带有DATAMANSES属性注释的POCO对象,并且当函数被调用时,由于性质。对于我认为的项目类型,输出被转换为JSON代码中没有一个时刻/地方可以使用自定义的数据替换代码WCF使用
DataContractJsonSerializer
来序列化POCO/DataContract对象,您可以调整默认的JSON序列化器,并用自定义的来替换
DataContractJsonSerializer
!这里有一篇文章向您展示如何:无论如何,有一个n如我将在上面的更新中所示,使用JavaScript中的正则表达式调整服务器返回的JSON文本,这对日期(而不是日期)非常有效,即不包含任何时区信息。尝试在以下字符串上执行此操作:“{”EndTime\:“\\/Date(1381479678557)\/\”,“StartTime\:“\\/Date(1381479678557+0200)\”.它只替换结束时间而不是开始时间
string input = [yourjsonstring]; 
MatchEvaluator me = new MatchEvaluator(MTListServicePage.MatchDate);
string json = Regex.Replace(input, "\\\\/\\Date[(](-?\\d+)[)]\\\\/", me, RegexOptions.None)
string input = [yourjsonstring]; 
MatchEvaluator me = new MatchEvaluator(MTListServicePage.MatchDate);
string json = Regex.Replace(input, "\\\\/\\Date[(](-?\\d+)[)]\\\\/", me, RegexOptions.None)