C# 使用不同格式序列化同一类中的多个DateTime属性
我有一个具有两个DateTime属性的类。我需要用不同的格式序列化每个属性。我怎么做?我试过:C# 使用不同格式序列化同一类中的多个DateTime属性,c#,.net,json,serialization,json.net,C#,.net,Json,Serialization,Json.net,我有一个具有两个DateTime属性的类。我需要用不同的格式序列化每个属性。我怎么做?我试过: JsonConvert.SerializeObject(obj, Formatting.None, new IsoDateTimeConverter {DateTimeFormat = "MM.dd.yyyy"}); 此解决方案不适用于我,因为它将日期格式应用于所有属性。有没有办法用不同的格式序列化每个DateTime属性?可能有一些属性?NewtonSoft.Json的结构有点难以理解
JsonConvert.SerializeObject(obj, Formatting.None,
new IsoDateTimeConverter {DateTimeFormat = "MM.dd.yyyy"});
此解决方案不适用于我,因为它将日期格式应用于所有属性。有没有办法用不同的格式序列化每个DateTime属性?可能有一些属性?
NewtonSoft.Json
的结构有点难以理解,您可以使用以下自定义转换器来完成您想要的操作:
[TestMethod]
公共空间转换()
{
var obj=新的双日期()
{
DateOne=新的日期时间(2013年7月25日),
DateTwo=新的日期时间(2013年7月25日)
};
Assert.AreEqual(“{\'DateOne\':\'07.25.2013\',\'DateTwo\':\'2013-07-25T00:00:00\”),
SerializeObject(obj,Formatting.None,新的DualDateJsonConverter());
}
双日期类
{
公共日期时间日期一{get;set;}
public DateTime DateTwo{get;set;}
}
类DualDateJsonConverter:JsonConverter
{
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
作业对象结果=新作业对象();
DualDate dd=(DualDate)值;
结果.Add(“DateOne”,JToken.FromObject(dd.DateOne.ToString(“MM.dd.yyyy”));
Add(“DateTwo”,JToken.FromObject(dd.DateTwo));
结果。写入(写入器);
}
//其他JSON转换方法
公共覆盖布尔CanConvert(类型objectType)
{
return objectType==typeof(DualDate);
}
公共覆盖布尔可写
{
得到
{
返回true;
}
}
公共覆盖布尔可读取
{
得到
{
返回false;
}
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
抛出新的NotImplementedException();
}
}
处理这种情况的一种简单方法是对IsoDateTimeConverter
进行子类化,以便为所需的每个不同日期格式创建自定义日期转换器。例如:
class MonthDayYearDateConverter : IsoDateTimeConverter
{
public MonthDayYearDateConverter()
{
DateTimeFormat = "MM.dd.yyyy";
}
}
class LongDateConverter : IsoDateTimeConverter
{
public LongDateConverter()
{
DateTimeFormat = "MMMM dd, yyyy";
}
}
然后,您可以使用[JsonConverter]
属性来修饰需要自定义格式的任何类中的单个日期时间
属性:
class Foo
{
[JsonConverter(typeof(MonthDayYearDateConverter))]
public DateTime Date1 { get; set; }
[JsonConverter(typeof(LongDateConverter))]
public DateTime Date2 { get; set; }
// Use default formatting
public DateTime Date3 { get; set; }
}
演示:
输出:
{
"Date1": "03.03.2014",
"Date2": "March 03, 2014",
"Date3": "2014-03-03T10:25:49.8885852-06:00"
}
您可以创建一个自定义日期类,该类继承IsoDateTimeConverter并在构造函数上传递格式。在属性上,可以指定每个属性对应的格式。见下面的代码:
public class LoginResponse
{
[JsonProperty("access_token")]
public string AccessToken { get; set; }
[JsonProperty("token_type")]
public string TokenType { get; set; }
[JsonProperty("expires_in")]
public DateTime ExpiresIn { get; set; }
[JsonProperty("userName")]
public string Username { get; set; }
[JsonConverter(typeof(CustomDateFormat), "EEE, dd MMM yyyy HH:mm:ss zzz")]
[JsonProperty(".issued")]
public DateTime Issued { get; set; }
[JsonConverter(typeof(CustomDateFormat), "MMMM dd, yyyy")]
[JsonProperty(".expires")]
public DateTime Expires { get; set; }
}
public class CustomDateFormat : IsoDateTimeConverter
{
public CustomDateFormat(string format)
{
DateTimeFormat = format;
}
}
我意识到这是一个老问题,但我在寻找同一个问题时偶然发现了它 Newtonsoft现在在JsonSerializerSettings类中有一个DateFormatString属性,您可以使用它。我来问这个问题是为了寻找答案,我刚刚找到了这个财产,我使用了它,如下所示,它的工作原理如下:
private const string _StrDateFormat = "yyyy-MM-dd HH:mm:ss";
private static string GetJSON(object value)
{
return JsonConvert.SerializeObject(value, new JsonSerializerSettings
{
DateFormatString = _StrDateFormat
});
}
当值
将有一个DateTime对象时,它将把它转换成字符串\u StrDateFormat
字符串
也许可以更新
注意。虽然此设置确实可以用于在每次序列化时全局更改日期格式,但它并不能解决以下问题:如何序列化包含两个日期的对象并使每个日期使用不同的格式。
private const string _StrDateFormat = "yyyy-MM-dd HH:mm:ss";
private static string GetJSON(object value)
{
return JsonConvert.SerializeObject(value, new JsonSerializerSettings
{
DateFormatString = _StrDateFormat
});
}