Datacontractjsonserializer - 反序列化日期时间 [英] Datacontractjsonserializer - deserializing datetime

查看:149
本文介绍了Datacontractjsonserializer - 反序列化日期时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

目前我有一个json字符串,其日期格式如下2012-03-01T08:00:00。每当尝试反序列化时,它显示不以'开头'/日期('和结束')/



我尝试过:



 public static T JsonDeserialize< T>(string jsonString)
{
//转换yyyy -MM-dd HH:mm:ssString as\ / Date(1319266795390 + 0800)\ /
string p = @\d {4} -\d {2} -\\ \\d {2} \s\d {2}:\d {2}:\d {2};

MatchEvaluator matchEvaluator = new MatchEvaluator(
ConvertDateStringToJsonDate);
Regex reg =新的正则表达式(p);
jsonString = reg.Replace(jsonString,matchEvaluator);
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj =(T)ser.ReadObject(ms);
return obj;
}

解决方案

上面的代码看起来过于复杂。使用JSON并不需要那么难。



要解码日期,我假设您的原始JSON数据类似于:

 {birthday:2012-03-01T08:00:00} 



这是 DataContractJsonSerializer 的已知格式。要解码,你可以使用类似这样的东西:

 [DataContract] 
public < span class =code-keyword> class 示例
{
[DataMember(Name = birthday)]
public DateTime Birthday { get ; set ; }
}



以上课程是使用 JsonUtils [ ^ ]网站。



为了看到这一点,我会使用这个帮助类 [ ^ 。它使用 Json.Net [ ^ ]:

 使用 Newtonsoft.Json; 
使用 System.Collections.Generic;

命名空间 Support.CSharp
{
public static class JsonHelper
{
public static string FromClass< T>(T data, bool isEmptyToNull = false
JsonSerializerSettings jsonSettings = null
{
string response = string .Empty;

if (!EqualityComparer< T> .Default.Equals(data, default (T)))
response = JsonConvert.SerializeObject(data,jsonSettings);

return isEmptyToNull? (response == {} null:response):response;
}

public static T ToClass< T>(< span class =code-keyword> string data,
JsonSerializerSettings jsonSettings = null
{
var response = default (T);

if (!string.IsNullOrEmpty(data))
response = jsonSettings == null
? JsonConvert.DeserializeObject< T>(data)
:JsonConvert.DeserializeObject< T>(data,jsonSettings);

return 响应;
}
}
}



使用:

  var  rawJson =   {\birthday \ :\2012-03-01T08:00:00\}; 
var result = JsonHelper.ToClass< Example>(rawJson);



在C#中使用JSON& VB [ ^ ]文章详细介绍了(可下载完全正常工作的代码),以便使用JSON,您应该会发现它们很有帮助。 :)


Currently I have a json string in which date format is like this "2012-03-01T08:00:00". whenever try to deserialize, it is showing "does not start with '/Date(' and end with ')/"

What I have tried:

public static T JsonDeserialize<T>(string jsonString)
    {
        //Convert "yyyy-MM-dd HH:mm:ss" String as "\/Date(1319266795390+0800)\/"
        string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";

    MatchEvaluator matchEvaluator = new MatchEvaluator(
            ConvertDateStringToJsonDate);
        Regex reg = new Regex(p);
        jsonString = reg.Replace(jsonString, matchEvaluator);
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
        T obj = (T)ser.ReadObject(ms);
        return obj;
    }

解决方案

The above code looks overly complicated. Working with JSON does not need to be that hard.

To decode the date, I am assuming, form your information above, that your raw JSON data looks something like:

{ "birthday":"2012-03-01T08:00:00" }


This is a known format for the DataContractJsonSerializer. To decode, you would use something like this class:

[DataContract]
public class Example
{
    [DataMember(Name="birthday")]
    public DateTime Birthday { get; set; }
}


The above class was generated using JsonUtils[^] website with the above JSON data.

To see this in action, I would use this Help Class[^]. It uses Json.Net[^]:

using Newtonsoft.Json;
using System.Collections.Generic;

namespace Support.CSharp
{
    public static class JsonHelper
    {
        public static string FromClass<T>(T data, bool isEmptyToNull = false,
                                          JsonSerializerSettings jsonSettings = null)
        {
            string response = string.Empty;

            if (!EqualityComparer<T>.Default.Equals(data, default(T)))
                response = JsonConvert.SerializeObject(data, jsonSettings);

            return isEmptyToNull ? (response == "{}" ? "null" : response) : response;
        }

        public static T ToClass<T>(string data,
                                   JsonSerializerSettings jsonSettings = null)
        {
            var response = default(T);

            if (!string.IsNullOrEmpty(data))
                response = jsonSettings == null
                    ? JsonConvert.DeserializeObject<T>(data)
                    : JsonConvert.DeserializeObject<T>(data, jsonSettings);

            return response;
        }
    }
}


And to use:

var rawJson = "{ \"birthday\":\"2012-03-01T08:00:00\" }";
var result = JsonHelper.ToClass<Example>(rawJson);


The Working with JSON in C# & VB[^] article goes into a lot more detail (with downloadable fully working code) for working with JSON that you should find helpful. :)


这篇关于Datacontractjsonserializer - 反序列化日期时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆