【问题标题】:DataContract and custom set/get to set a DateTime from a stringDataContract 和自定义设置/获取从字符串设置 DateTime
【发布时间】:2012-02-29 13:28:20
【问题描述】:

我需要解析来自服务器的 JSON 数据并制作对象实例列表。

我正在使用 DataContract 来在 json 字典字段和类属性之间建立关联,但是我有一个问题:其中一个字段包含字符串中的日期(类似于“2011-01-01 15: 00 UTC");我想把它放在 DateTime 属性中。

如何将此字符串转换为日期时间并使用 DataContract 自动将属性传递给它?这可能吗?

【问题讨论】:

  • 如果你想使用 Json.Net Here 是一个答案。
  • 事实上,我选择了 DataContract,因为它允许我轻松地从 JSON 字典转换为运行时类。与 JSON.net 有什么区别?
  • 您可以更好地控制序列化/反序列化过程。请参阅我之前评论中的 ex 链接。您还可以轻松地使用dynamic,因为它可以将对象反序列化为字典。以下是一些工作示例。 pastebin.com/JEYfgL3a 。最好看看it's home page

标签: c# datacontract


【解决方案1】:

您可以为此目的使用属性:

[DataMember(Name="Foo")]
public string FormattedFoo {
    get { return /* apply some custom formatting to 'Foo' */; }
    set { Foo = /* apply some custom parsing to 'value' */; }
}
public DateTime Foo {get;set;}

【讨论】:

  • 我已经按照您的建议进行了尝试,但出现了这个错误:pastebin.com/jbtDej3C。马克有什么想法吗?
  • @malcom 你在使用 Parse 吗?还是 ParseExact?要么...?什么是样本输入?
  • 解析和精确解析都返回相同的错误。值是格式为“2012/01/01 00:00:00”的字符串
  • @malcom 用你的格式将- 换成/,然后;在这里使用"yyyy/MM/dd HH:mm:ss" 进行测试工作正常
  • 我的错误。日期是这样的:“2012-02-21 12:41:23”。 Datecontract 属性代码是这样的:pastebin.com/58MfNmmZ。代码在imgur.com/JGHku 崩溃(在解析数据属性时。数据似乎解析得很好,但是当我尝试将它分配给我的 DateTime 对象时发生了一些事情)
【解决方案2】:

DataMember属性放在字段上而不是属性上,并使用setter/getter进行转换:

const string DATE_TIME_FORMAT = "<your format>";

[DataMember]
string myDate;

public DateTime MyDate {
  get 
  {
    return DateTime.ParseExact(myDate, DATE_TIME_FORMAT, CultureInfo.CurrentCulture);
  }
  set 
  {
    myDate = value.ToString(DATE_TIME_FORMAT);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多