You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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序列化逻辑。

  1. 先写一个自定义的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>()
        );
    }
}
  1. 在Person类的Birth属性上标记转换器:
public class Person 
{ 
    public string Name { get; set; } 
    // 给Birth属性指定自定义转换器
    [JsonConverter(typeof(DateTimeToDateObjectConverter))]
    public DateTime Birth { get; set; } 
}
  1. 执行序列化:
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类的源码,可以用这种方式:

  1. 同样先定义好上面的DateTimeToDateObjectConverter转换器

  2. 序列化时传入自定义的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:31:26