如何使用Newtonsoft.Json将含DateTime的对象序列化为自定义JSON
如何用Newtonsoft.Json将Person类序列化为自定义格式的JSON?
先明确你的需求:
现有Person类代码:
public class Person { public string Name { get; set; } public DateTime Birth { get; set; } }
希望序列化后得到这样的JSON:
{ "Name":"Tom", "Birth":{"Year":1999,"Month":12,"Day":1} }
默认情况下Newtonsoft.Json会把DateTime序列化为标准格式字符串(比如"1999-12-01T00:00:00"),要实现你要的嵌套结构,自定义JsonConverter是最直接的方案,下面给你两种具体实现方式,按需选择:
方式一:给Birth属性添加特性(局部生效)
这种方式只针对Person类的Birth属性生效,不会影响其他地方的DateTime序列化逻辑。
- 先写一个自定义的DateTime转换器:
public class DateTimeToDateObjectConverter : JsonConverter<DateTime> { // 序列化逻辑:把DateTime转成包含Year/Month/Day的匿名对象 public override void WriteJson(JsonWriter writer, DateTime value, JsonSerializer serializer) { serializer.Serialize(writer, new { Year = value.Year, Month = value.Month, Day = value.Day }); } // 如果需要反序列化(把JSON转回Person对象),可以实现这个方法 public override DateTime ReadJson(JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer) { var dateObj = serializer.Deserialize<JObject>(reader); return new DateTime( dateObj["Year"].Value<int>(), dateObj["Month"].Value<int>(), dateObj["Day"].Value<int>() ); } }
- 在Person类的Birth属性上标记转换器:
public class Person { public string Name { get; set; } // 给Birth属性指定自定义转换器 [JsonConverter(typeof(DateTimeToDateObjectConverter))] public DateTime Birth { get; set; } }
- 执行序列化:
var tom = new Person { Name = "Tom", Birth = new DateTime(1999, 12, 1) }; string json = JsonConvert.SerializeObject(tom); // 输出结果就是你要的:{"Name":"Tom","Birth":{"Year":1999,"Month":12,"Day":1}}
方式二:全局配置转换器(全局生效)
如果你希望所有DateTime类型都序列化成这种嵌套结构,或者不想修改Person类的源码,可以用这种方式:
同样先定义好上面的
DateTimeToDateObjectConverter转换器序列化时传入自定义的
JsonSerializerSettings:
var settings = new JsonSerializerSettings(); // 添加自定义转换器到全局设置 settings.Converters.Add(new DateTimeToDateObjectConverter()); var tom = new Person { Name = "Tom", Birth = new DateTime(1999, 12, 1) }; string json = JsonConvert.SerializeObject(tom, settings); // 同样会输出符合要求的JSON
两种方式都能实现你的需求,如果你只是需要Person类的Birth属性特殊处理,选方式一;如果全局都要统一格式,选方式二就行。
内容的提问来源于stack exchange,提问作者Craig Duan
相关产品推荐
相关产品推荐

