【问题标题】:How to change Dates format from text (Json string) in c# (or how to get date values from a long string)如何从 C# 中的文本(Json 字符串)更改日期格式(或如何从长字符串中获取日期值)
【发布时间】:2015-03-12 13:21:28
【问题描述】:

我有 Json 字符串

....
{'ItemId':340,'LineId':340,'ItemName':'Trim 1_5A','ItemType':1},{'ItemId':341,'LineId':341,'ItemName':'Trim 1_5B','ItemType':1}]},'Success':true,'Errors':[],'OperationCanceled':false,'ErrorsConcatented':'','ResponseTime':'/Date(1425474069569)/'}

....

....
{'ItemId':350,'LineId':340,'ItemName':'Trim 1_5A','ItemType':1},{'ItemId':341,'LineId':341,'ItemName':'Trim 1_5B','ItemType':1}]},'Success':true,'Errors':[],'OperationCanceled':false,'ErrorsConcatented':'','ResponseTime':'/Date(1425474069569)/'}

....

那个文本有一个日期时间'ResponseTime':'/Date(1425474069569)/,我想从那个字符串格式化(mm-dd-yyyy)这个日期。

为了反序列化 JSON,我使用了 JavaScriptSerializer。当我尝试反序列化我的 JSON 时,我收到以下错误:

/Date(1425473984603)/ 不是 DateTime 的有效值

我该怎么做?我在谷歌搜索了很多,但无法找到解决方案:(

如果可以的话,请帮帮我..

【问题讨论】:

  • 你用什么解析JSON?
  • 你是如何反序列化你的 json 的?在一个类中,ResponseTime 属性的数据类型是什么?
  • 同名属性ResponseTime
  • 你能展示你的 c# 类你正在反序列化到吗?
  • 我不能,因为那是很长的数据,所以那里有很多属性。

标签: c# asp.net json asp.net-mvc datetime


【解决方案1】:

JSON 可以被解析成看起来像 JSON 结构的对象。例如,

{
    days: [
        {name: 'monday', value: 5}, 
        {name: 'tuesday', value: 7}
    ],
    week: 18
}

将成为具有两个属性的对象:daysweek。 然后,您可以像使用任何其他 C# 对象一样使用该对象:

Console.WriteLine(parsed.week); //Prints 18
Console.WriteLine(parsed.days[0].name); //Prints 'Monday'
Console.WriteLine(parsed.days[1].value); //Prints 7

所以,关于你的实际数据:

您的 JSON 示例似乎有点格式错误,所以我稍微修改了开头以制作一个简单的示例。

使用JSON.Net(可以用NuGet安装),可以这样:

var jsonString = "{data: [{'ItemId':340,'LineId':340,'ItemName':'Trim 1_5A','ItemType':1},{'ItemId':341,'LineId':341,'ItemName':'Trim 1_5B','ItemType':1}],'Success':true,'Errors':[],'OperationCanceled':false,'ErrorsConcatented':'','ResponseTime':'/Date(1425474069569)/'}";
dynamic data = JValue.Parse(jsonString);

Console.WriteLine(data.ResponseTime); //this is your DateTime object
Console.WriteLine(data.ResponseTime.ToString("mm-dd-yyyy")); //Formatted like you wanted it

编辑:没有包。使用 System.Web.Helpers.Json 怎么样?

dynamic data = System.Web.Helpers.Json.Decode(jsonString);

Console.WriteLine(data.ResponseTime); ///Date(1425474069569)/

//Now we need to create a DateTime object from this string.
var timeString = data.ResponseTime.Replace("/Date(", "").Replace(")/",""); //Remove the wrapping
var seconds = long.Parse(timeString)/1000; //Parse the number, and turn it into seconds (it was milliseconds)
var date = new DateTime(1970,1,1,0,0,0).AddSeconds(seconds); //Create a new DateTime object starting on the Unix date, and add the seconds
Console.WriteLine(date.ToString("dd-MM-yyyy"));

如果你甚至没有 System.Web.Helpers,你也可以手动解析字符串(Regex.Split、String.Split、String.Replace 等),并使用上述方法创建 DateTime 对象来自日期字符串。

【讨论】:

  • 我不想为这个主题添加任何包,是否可以不添加任何包?
  • 以一种方式进行编辑,无需任何额外的软件包。
  • 没关系,但是我怎样才能得到ResponseTime?我在 json 字符串中有很多 ResponseTime 属性
  • 当使用上述两种方法之一反序列化 Json 时,您会得到与 Json 类似的对象。这意味着您可以使用 data.ResponseTime(就像我所做的那样——上面的代码就是您需要的一切),或者,如果您解析您拥有的整个 JSON 字符串,可能类似于 data.Objects[i].ResponseTime。它就像一个普通的物体。
  • 在我的答案顶部添加了一个部分,希望能更清楚。
【解决方案2】:

您应该将 JSON 字符串反序列化为一个对象。

您可以使用 Newtonsoft JSON、JavaScriptSerializer Deserilize 或其他东西。在 C# 中反序列化 JSON 内容后,您将拥有 ResponseTime 属性的 DateTime 对象。一旦你有了日期对象,你就可以像这样给出日期格式......

string mystring = String.Format("{0:MM-dd-yyyy}", dt);          // "03-09-2008"

其中 dt 是您的 DateTime 对象,mystring 是字符串值...

MSDN Custom Date Time formats doc

反序列化错误

错误是 /Date(1425473984603)/ 不是 DateTime 的有效值。

检查日期中的斜线是与日期对象和 JavaScriptSerializer 类似的反序列化错误

Date Issue with JavaScriptSerializer

【讨论】:

  • 我没有 datetime 对象,我只有一个 json 文本
  • 您应该将您的 JSON 反序列化为具有相应属性的对象。您可以使用许多序列化程序。您可以使用 Newtonsoft nuget.org/packages/Newtonsoft.Json 或 JavaScriptSerializer 来反序列化您的对象...
  • 我在使用JavaScriptSerializer 反序列化对象时出错。
  • 您从未提到反序列化对象时出错。你能包括那个信息吗?另外,假设您反序列化了 JSON,我也回答了您的原始问题...
  • 另外,如果您可以包含您尝试将 JSON 反序列化为的类会有所帮助。
【解决方案3】:

如果日期是这种格式 D:20181116110130+05'30' 或 D:20181116110130-05'30'

 private static string ConvertInToDateTime(string DateTime)
    {
        string[] SplitDate = DateTime.Split(':');
        string[] SplitDateTime = null;
        if (SplitDate[1].Contains("+"))
            SplitDateTime = SplitDate[1].Split('+');
        else if (SplitDate[1].Contains("-"))
            SplitDateTime = SplitDate[1].Split('-');
        string TimeStamp = SplitDateTime[0].Insert(12, ":").Insert(10, ":").Insert(8, " ").Insert(6, "-").Insert(4, "-");
        return TimeStamp;
    }

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2016-02-21
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多