当前位置: 首页 > news >正文

net9.0 中System.Text.Json序列化和反序列化

net9.0 中System.Text.Json 测试惊喜的发现当前版本循环引用序列化未报错,并且能正常序列化成功,故做此记录。测试结果仅做参考!!!
配置选项
     # 配置说明
    JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions
    {
        PropertyNameCaseInsensitive = true, // 属性名称大小写不敏感
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 属性名称使用驼峰命名规则
        WriteIndented = true, // 设置格式化输出
        Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, // 允许特殊字符
        ReadCommentHandling = JsonCommentHandling.Skip, // 忽略注释
        AllowTrailingCommas = true, // 忽略尾随逗号
        NumberHandling = JsonNumberHandling.AllowReadingFromString, // 允许数字字符串
        Converters = { new DatetimeJsonConverter() } // 注册你的自定义转换器, 
    };
DatetimeJsonConverter 自定义解析
/// <summary>
/// 时间字符串格式化
/// </summary>
public class DatetimeJsonConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.String)
        {
            if (DateTime.TryParse(reader.GetString(), out DateTime date))
                return date;
        }
        return reader.GetDateTime();
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));

    }
}

/// <summary>
/// Unix格式时间格式化
/// </summary>
public class UnixTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.String)
        {
            if (long.TryParse(reader.GetString(), out long timestamp))
                return DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        }

        if (reader.TokenType == JsonTokenType.Number)
        {
            long timestamp = reader.GetInt64();
            return DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        }
        return reader.GetDateTime();
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        long timestamp = new DateTimeOffset(value).ToUnixTimeSeconds();
        writer.WriteStringValue(timestamp.ToString());
    }
}
测试
 public class TestJson
 {
     /// <summary>
     /// 名称
     /// </summary>
     public string? Name { get; set; }

     public TestBaseJson TestBaseJson { get; set;}
 }

 //[JsonPolymorphic(TypeDiscriminatorPropertyName = "TestBaseJson")]
 //[JsonDerivedType(typeof(TestBaseJson))]
 public class TestBaseJson
 {
     public string? Name { get; set; }
     public int Id { get; set; }

     public TestBaseJson TestBase { get; set; }
 }


   TestJson testJson =new() {
       Name = "ces",
       Date=DateTime.Now,
       TestBaseJson = new TestBaseJson() { 
           Id = 123, Name = "测试",
           TestBase = new TestBaseJson() {
               Id = 123, Name = "2222"
           } }

   };
 JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions
 {
     PropertyNameCaseInsensitive = true, // 属性名称大小写不敏感
     PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 属性名称使用驼峰命名规则
     WriteIndented = true, // 设置格式化输出
     Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, // 允许特殊字符
     ReadCommentHandling = JsonCommentHandling.Skip, // 忽略注释
     AllowTrailingCommas = true, // 忽略尾随逗号
     NumberHandling = JsonNumberHandling.AllowReadingFromString, // 允许数字字符串
     Converters = { new DatetimeJsonConverter() } // 注册你的自定义转换器, 
 };
 // 序列化
 Console.WriteLine(JsonSerializer.Serialize(testJson, jsonSerializerOptions));
 // 反序列化
  //string jsonStr = "{\r\n  \"name\": \"ces\",\r\n  \"testBaseJson\": {\r\n    \"name\": \"测试\",\r\n    \"id\": 123,\r\n    \"testBase\": {\r\n      \"name\": \"2222\",\r\n      \"id\": 123,\r\n      \"testBase\": null\r\n    }\r\n  },\r\n  \"date\": \"2025-04-08 10:19:43\"\r\n}";
  // 或者
  string jsonStr = "{\"name\":\"ces\",\"testBaseJson\":{\"Name\":\"测试\",\"id\":\"123\",\"testBase\":{\"name\":\"2222\",\"id\":123,\"testBase\":null,}},\"date\":\"2025-04-08 10:19:43\"}";
   // 这里加了多余逗号,数字字符串,大小写等,进行反序列化
    TestJson testJson2 = JsonSerializer.Deserialize<TestJson>(jsonStr, jsonSerializerOptions);

序列化

反序列化

相关文章:

  • spring-cloud-starter-dubbo使用说明
  • TypeScript:从类型工具到前端系统设计的跃迁
  • Python和MicroPython的解释器区别
  • 【算法学习计划】回溯 -- 综合题目(上)
  • 深入理解 Handler、Looper 、 MessageQueue和 HandlerThread
  • LINUX的使用(1)-挂载云硬盘
  • setInterval问题以及前端如何实现精确的倒计时
  • Error 1062 (23000): Duplicate entry ‘‘ for key ‘id‘`
  • Perl 发送邮件
  • 24统计建模国奖作品分享+写作框架提取3
  • Cursor 在前端需求开发工作流中的应用|得物技术
  • 根据日期格式化的常见规则和标准
  • 编程助手fitten code使用说明(超详细)(vscode)
  • spring mvc的拦截器HandlerInterceptor 接口详解
  • Java面试黄金宝典42
  • 2.ElasticSearch-Java API
  • 面试算法高频04-分治与回溯
  • Redis 简介+部署+常用命令!!!
  • 探秘传感器类型:解锁科技新视界
  • 关于使用python 安装 flask-openapi3扩展,使用docker 环境的完整复盘
  • 租车网站制作/品牌宣传活动策划方案
  • wordpress优化图片/网站seo推广员招聘
  • 网站开发毕业指导手册/网页设计期末作业模板
  • 哪个网站可以做照片分享/推广引流吸引人的文案
  • 如何给网站挂黑链/seo简单优化操作步骤
  • 30岁做网站编辑/企业推广宣传文案