反序列化ISO 8601日期

3

我有一个如下的类:

public class ViewItem
{
    [DataMember(Name = "title")]
    public string Title { get; set; }

    [DataMember(Name = "created_at")]
    public string CreatedAt { get; set; }
}

当我尝试将JSON字符串反序列化为对象时,CreatedAt字段的值始终为空。我的JSON字符串如下:
[ { "created_at" : "2014-03-05T10:26:12Z" ,
    "title"      : "task 4"
  } ,
  { "created_at" : "2014-03-05T10:26:12Z" ,
    "title"      : "task 5"
  }
]

反序列化代码如下:
JsonConvert.DeserializeObject<List<ViewItem>>(json);

我已经阅读了this article,并尝试提供不同的JSON转换和日期解析处理,但都没有起作用。
更新:
我已经尝试了CreatedAt属性作为DateTime、DateTime?和DateTimeOffset以及简单字符串。

你的JSON无效。日期值和“title”属性之间需要有逗号。您可以在jsonlint.com上检查它。 - Brian Rogers
谢谢。实际上这是一个打字错误,我从Visual Studio IDE复制粘贴到这里时出错了。我已经纠正了它。但是它仍然不起作用。 - Jay Nanavaty
3个回答

4
尝试在你的类声明中添加 [DataContract]。同时,将 CreatedAt 属性的类型从 string 改为 DateTime
[DataContract]
public class ViewItem
{
    [DataMember(Name = "title")]
    public string Title { get; set; }

    [DataMember(Name = "created_at")]
    public DateTime CreatedAt { get; set; }
}

针对这些更改(以及JSON的修复),我已经解决了问题:

string json = @"[{""created_at"":""2014-03-05T10:26:12Z"",""title"":""task 4""},{""created_at"":""2014-03-05T10:26:12Z"",""title"":""task 5""}]";

List<ViewItem> list = JsonConvert.DeserializeObject<List<ViewItem>>(json);
foreach (ViewItem item in list)
{
    Console.WriteLine("Title: " + item.Title);
    Console.WriteLine("CreatedAt: " + item.CreatedAt);
}

输出:

Title: task 4
CreatedAt: 3/5/2014 10:26:12 AM
Title: task 5
CreatedAt: 3/5/2014 10:26:12 AM

0

您正在使用来自 System.Runtime.SerializationDataMemberAttribute,但是要使用 Newtonsoft.Json 中的 JsonConvert 进行反序列化。

使用:

[JsonProperty("title")]

使用以下代替:

[DataMember(Name = "title")]

0
DateTime dateProperty=Convert.ToDateTime(DateTime)

将会产生

"dateProperty":"/Date(1343966400000-0400)/"

相反:

string dateProperty=Convert.ToString(DateTime)

将会产生

"dateProperty":"2012年8月3日 下午6:20:43"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接