8

我有一个json,它的日期为2012-06-07T00:29:47.000,必须反序列化。但是在

 DataContractJsonSerializer serializer = new DataContractJsonSerializer(type);
 return (object)serializer.ReadObject(Util.GetMemoryStreamFromString(json));

我得到以下异常

There was an error deserializing the object of type System.Collections.Generic.List`1
[[MyNameSpace.MyClass, MyNameSpace, Version=1.0.4541.23433, Culture=neutral, PublicKeyToken=null]].
 DateTime content '2012-06-07T00:29:47.000' does not start with '\/Date(' and end with ')\/' as required for JSON

它在 windows mobile 7 中工作,但相同的代码在 windows 8 中不工作。
它期望日期格式\/Date(1337020200000+0530)\/而不是2012-06-07T00:29:47.000.

如果是,它是否需要自定义序列化,那么如何?而且我不能使用JSON.NET我一定要使用DataContractJsonSerializer,我不能更改 JSON 的格式,因为相同的 JSON 用于 android。
我是.net 的新手。谢谢。

4

2 回答 2

7

使用一个字符串属性进行序列化/反序列化,并使用一个单独的非序列化属性将其转换为 DateTime。更容易看到一些示例代码:

[DataContract]
public class LibraryBook
{
    [DataMember(Name = "ReturnDate")]
    // This can be private because it's only ever accessed by the serialiser.
    private string FormattedReturnDate { get; set; }

    // This attribute prevents the ReturnDate property from being serialised.
    [IgnoreDataMember]
    // This property is used by your code.
    public DateTime ReturnDate
    {
        // Replace "o" with whichever DateTime format specifier you need.
        // "o" gives you a round-trippable format which is ISO-8601-compatible.
        get { return DateTime.ParseExact(FormattedReturnDate, "o", CultureInfo.InvariantCulture); }
        set { FormattedReturnDate = value.ToString("o"); }
    }
}

您可以改为在 FormattedReturnDate 的设置器中进行解析,以便在收到错误日期时使其提前失败。


编辑以包含GôTô的建议,为序列化的 DataMember 提供正确的名称。

于 2012-06-08T09:31:11.737 回答
1

在 DataContractJsonSerializer 构造函数中传递格式

var serializer = new DataContractJsonSerializer(
   typeof(Client),
   new DataContractJsonSerializerSettings {
       DateTimeFormat = new DateTimeFormat("yyyy-MM-dd hh:mm:ss"),
    });
于 2019-02-27T12:54:51.150 回答