Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用不同格式序列化同一类中的多个DateTime属性_C#_.net_Json_Serialization_Json.net - Fatal编程技术网

C# 使用不同格式序列化同一类中的多个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的结构有点难以理解

我有一个具有两个DateTime属性的类。我需要用不同的格式序列化每个属性。我怎么做?我试过:

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
        });
    }