Datacontractjsonserializer - 反序列化日期时间 [英] Datacontractjsonserializer - deserializing datetime
问题描述
目前我有一个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 theDataContractJsonSerializer
. 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屋!