ASP.NET Core 3.1系列(29)——System.Text.Json实现JSON的序列化和反序列化

news2024/11/17 1:41:34

1、前言

Web开发中,JSON数据可以说是无处不在。由于具有轻量、易读等优点,JSON已经成为当前主流的数据传输格式。在ASP.NET Core 3.0之前,大多数项目都会使用Newtonsoft.Json组件来实现JSON的序列化和反序列化操作,而从ASP.NET Core 3.1开始,微软提供的System.Text.Json已经相当出色,其效率相比前者可以说是有过之而无不及,下面就来介绍一下它的使用方法。

2、引入System.Text.Json

新建一个Web API项目,使用NuGet引入如下组件:

System.Text.Json

在这里插入图片描述
新建一个实体类Person,代码如下:

using System;

namespace App
{
    public class Person
    {
        public int Id { get; set; }
        public string PersonName { get; set; }
        public string PersonGender { get; set; }
        public DateTime? BirthOfDate { get; set; }
    }
}

新建一个控制器PersonController,添加一个Get方法,代码如下:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        [HttpGet]
        public JsonResult Get()
        {
            List<Person> list = new List<Person>
            {
                new Person { Id = 1, PersonName = "张三", PersonGender = "男", PersonAge = 30 },
                new Person { Id = 2, PersonName = "李四", PersonGender = "女", PersonAge = 31 },
                new Person { Id = 3, PersonName = "王五", PersonGender = "男", PersonAge = 32 }
            };
            return new JsonResult(list);
        }
    }
}

运行结果如下所示:

[{"id":1,"personName":"\u5F20\u4E09","personGender":"\u7537","birthOfDate":"2000-01-01T00:00:00"},{"id":1,"personName":"\u674E\u56DB","personGender":"\u5973","birthOfDate":"2000-02-02T00:00:00"},{"id":1,"personName":"\u738B\u4E94","personGender":"\u7537","birthOfDate":"2000-03-03T00:00:00"}]

上面的代码实现了一个简单的JSON序列化操作,但里面的问题也有很多,比如中文乱码、时间格式等等,下面就来说一说如何在System.Text.Json中去设置它们。

3、序列化操作

3.1、JSON数据编码

上面的运行结果显示中文乱码,我们可以使用JsonSerializerOptions中的Encoder来指定编码格式,代码如下:

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        [HttpGet]
        public JsonResult Get()
        {
            List<Person> list = new List<Person>
            {
                new Person { Id = 1, PersonName = "张三", PersonGender = "男", BirthOfDate = new DateTime(2000, 1, 1) },
                new Person { Id = 2, PersonName = "李四", PersonGender = "女", BirthOfDate = new DateTime(2000, 2, 2) },
                new Person { Id = 3, PersonName = "王五", PersonGender = "男", BirthOfDate = new DateTime(2000, 3, 3) }
            };
            return new JsonResult(list, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            });
        }
    }
}

运行结果如下所示,可以发现中文编码正确。

[{"Id":1,"PersonName":"张三","PersonGender":"男","BirthOfDate":"2000-01-01T00:00:00"},{"Id":2,"PersonName":"李四","PersonGender":"女","BirthOfDate":"2000-02-02T00:00:00"},{"Id":3,"PersonName":"王五","PersonGender":"男","BirthOfDate":"2000-03-03T00:00:00"}]

3.2、JSON文本格式化

默认输出的JSON文本是未经格式化的,如果你希望JSON看起来清楚一些,可以设置WriteIndented属性值,代码如下:

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        [HttpGet]
        public JsonResult Get()
        {
            List<Person> list = new List<Person>
            {
                new Person { Id = 1, PersonName = "张三", PersonGender = "男", BirthOfDate = new DateTime(2000, 1, 1) },
                new Person { Id = 2, PersonName = "李四", PersonGender = "女", BirthOfDate = new DateTime(2000, 2, 2) },
                new Person { Id = 3, PersonName = "王五", PersonGender = "男", BirthOfDate = new DateTime(2000, 3, 3) }
            };
            return new JsonResult(list, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
                WriteIndented = true
            });
        }
    }
}

运行结果如下所示,可以发现JSON文本已经被格式化了。

[
  {
    "Id": 1,
    "PersonName": "张三",
    "PersonGender": "男",
    "BirthOfDate": "2000-01-01T00:00:00"
  },
  {
    "Id": 2,
    "PersonName": "李四",
    "PersonGender": "女",
    "BirthOfDate": "2000-02-02T00:00:00"
  },
  {
    "Id": 3,
    "PersonName": "王五",
    "PersonGender": "男",
    "BirthOfDate": "2000-03-03T00:00:00"
  }
]

3.3、JSON字段命名格式

上面的输出结果遵循的是首字母大写的帕斯卡命名格式,如果希望输出结果采用驼峰式进行命名,则可以对PropertyNamingPolicy进行设置,代码如下:

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        [HttpGet]
        public JsonResult Get()
        {
            List<Person> list = new List<Person>
            {
                new Person { Id = 1, PersonName = "张三", PersonGender = "男", BirthOfDate = new DateTime(2000, 1, 1) },
                new Person { Id = 2, PersonName = "李四", PersonGender = "女", BirthOfDate = new DateTime(2000, 2, 2) },
                new Person { Id = 3, PersonName = "王五", PersonGender = "男", BirthOfDate = new DateTime(2000, 3, 3) }
            };
            return new JsonResult(list, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
                WriteIndented = true,
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            });
        }
    }
}

运行结果如下所示,可以发现JSON文本采用的是驼峰式命名。

[
  {
    "id": 1,
    "personName": "张三",
    "personGender": "男",
    "birthOfDate": "2000-01-01T00:00:00"
  },
  {
    "id": 2,
    "personName": "李四",
    "personGender": "女",
    "birthOfDate": "2000-02-02T00:00:00"
  },
  {
    "id": 3,
    "personName": "王五",
    "personGender": "男",
    "birthOfDate": "2000-03-03T00:00:00"
  }
]

3.4、忽略JSON中的null值

在序列化时,如果对象的属性值为null,则结果中也会显示为null。如果希望忽略null值,则可以对DefaultIgnoreCondition进行设置,代码如下:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Unicode;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        [HttpGet]
        public JsonResult Get()
        {
            List<Person> list = new List<Person>
            {
                new Person { Id = 1, PersonName = "张三", PersonGender = "男", BirthOfDate = null },
                new Person { Id = 2, PersonName = "李四", PersonGender = "女", BirthOfDate = null },
                new Person { Id = 3, PersonName = "王五", PersonGender = "男", BirthOfDate = null }
            };
            return new JsonResult(list, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
                WriteIndented = true,
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
            });
        }
    }
}

运行结果如下所示,可以发现BirthOfDate字段的值被忽略了。

[
  {
    "id": 1,
    "personName": "张三",
    "personGender": "男"
  },
  {
    "id": 2,
    "personName": "李四",
    "personGender": "女"
  },
  {
    "id": 3,
    "personName": "王五",
    "personGender": "男"
  }
]

3.5.、JSON忽略只读字段

一般来说,由于只读字段无法进行反序列化操作,因此在序列化时可以考虑忽略。现在对Person代码进行修改,添加一个只读字段Info,代码如下:

using System;

namespace App
{
    public class Person
    {
        public int Id { get; set; }
        public string PersonName { get; set; }
        public string PersonGender { get; set; }
        public DateTime? BirthOfDate { get; set; }
        public string Info
        {
            get { return $"姓名:{PersonName},性别:{PersonGender},出生日期:{BirthOfDate}"; }
        }
    }
}

我们可以对JsonSerializerOptions中的IgnoreReadOnlyProperties字段进行设置,从而忽略只读字段,代码如下:

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        [HttpGet]
        public JsonResult Get()
        {
            List<Person> list = new List<Person>
            {
                new Person { Id = 1, PersonName = "张三", PersonGender = "男", BirthOfDate = new DateTime(2000, 1, 1) },
                new Person { Id = 2, PersonName = "李四", PersonGender = "女", BirthOfDate = new DateTime(2000, 2, 2) },
                new Person { Id = 3, PersonName = "王五", PersonGender = "男", BirthOfDate = new DateTime(2000, 3, 3) }
            };
            return new JsonResult(list, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
                WriteIndented = true,
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
                IgnoreReadOnlyProperties = true
            });
        }
    }
}

运行结果如下所示,可以发现Info字段并没有被序列化。

[
  {
    "id": 1,
    "personName": "张三",
    "personGender": "男",
    "birthOfDate": "2000-01-01T00:00:00"
  },
  {
    "id": 2,
    "personName": "李四",
    "personGender": "女",
    "birthOfDate": "2000-02-02T00:00:00"
  },
  {
    "id": 3,
    "personName": "王五",
    "personGender": "男",
    "birthOfDate": "2000-03-03T00:00:00"
  }
]

3.6、JSON中的时间格式

在上面的代码中,时间字段BirthOfDate的序列化结果有一些问题,如何把它序列化成我们熟悉的时间格式呢?首先定义一个类DateTimeJsonConverter,该类继承JsonConverter<DateTime>,代码如下:

using System;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace App
{
    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 dateTime))
                {
                    return dateTime;
                }
            }
            return reader.GetDateTime();
        }

        public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToString("yyyy年MM月dd日 HH时mm分ss秒"));
        }
    }
}

然后在JsonSerializerOptions中的Converters集合中加入它即可,代码如下:

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Unicode;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        [HttpGet]
        public JsonResult Get()
        {
            List<Person> list = new List<Person>
            {
                new Person { Id = 1, PersonName = "张三", PersonGender = "男", BirthOfDate = new DateTime(2000, 1, 1, 0, 0, 0) },
                new Person { Id = 2, PersonName = "李四", PersonGender = "女", BirthOfDate = new DateTime(2000, 2, 2) },
                new Person { Id = 3, PersonName = "王五", PersonGender = "男", BirthOfDate = new DateTime(2000, 3, 3) }
            };

            JsonSerializerOptions options = new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
                WriteIndented = true,
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
            };
            options.Converters.Add(new DateTimeJsonConverter());

            return new JsonResult(list, options);
        }
    }
}

运行结果如下所示,可以发现BirthOfDate字段的值已经被格式化。

[
  {
    "id": 1,
    "personName": "张三",
    "personGender": "男",
    "birthOfDate": "2000年01月01日 00时00分00秒"
  },
  {
    "id": 2,
    "personName": "李四",
    "personGender": "女",
    "birthOfDate": "2000年02月02日 00时00分00秒"
  },
  {
    "id": 3,
    "personName": "王五",
    "personGender": "男",
    "birthOfDate": "2000年03月03日 00时00分00秒"
  }
]

4、反序列化操作

4.1、常规操作

JSON的反序列化操作比较简单,只需要调用Deserialize即可。代码如下:

using Microsoft.AspNetCore.Mvc;
using System.Text.Json;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        [HttpGet]
        public ActionResult<string> Get()
        {
            string json = "{\"Id\":1,\"PersonName\":\"张三\",\"PersonGender\":\"男\",\"BirthOfDate\":\"2000-01-01T00:00:00\"}";
            Person person = JsonSerializer.Deserialize<Person>(json);
            return $"姓名:{person.PersonName}\n性别:{person.PersonGender}\n出生日期:{person.BirthOfDate}";
        }
    }
}

运行结果如下所示:

姓名:张三
性别:男
出生日期:2000/1/1 0:00:00

4.2、特殊情况的处理

在进行反序列化操作时,有一种情况需要特别注意,那就是属性值末尾存在逗号的情况。在JavaScript中,下面的代码是允许的,即:在BirthOfDate的属性值后面允许添加一个逗号:

{
  "Id": 1,
  "PersonName": "张三",
  "PersonGender": "男",
  "BirthOfDate": "2000-01-01T00:00:00",
}

但这种情况会导致反序列化报错,代码如下:

using Microsoft.AspNetCore.Mvc;
using System.Text.Json;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        [HttpGet]
        public ActionResult<string> Get()
        {
            string json = "{\"Id\":1,\"PersonName\":\"张三\",\"PersonGender\":\"男\",\"BirthOfDate\":\"2000-01-01T00:00:00\",}";
            Person person = JsonSerializer.Deserialize<Person>(json);
            return $"姓名:{person.PersonName}\n性别:{person.PersonGender}\n出生日期:{person.BirthOfDate}";
        }
    }
}

运行结果如下图所示:

在这里插入图片描述
如果要允许这种末尾添加逗号的情况,需要设置JsonSerializerOptionsAllowTrailingCommas属性,代码如下:

using Microsoft.AspNetCore.Mvc;
using System.Text.Json;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        [HttpGet]
        public ActionResult<string> Get()
        {
            string json = "{\"Id\":1,\"PersonName\":\"张三\",\"PersonGender\":\"男\",\"BirthOfDate\":\"2000-01-01T00:00:00\",}";
            Person person = JsonSerializer.Deserialize<Person>(json, new JsonSerializerOptions
            {
                AllowTrailingCommas = true
            });
            return $"姓名:{person.PersonName}\n性别:{person.PersonGender}\n出生日期:{person.BirthOfDate}";
        }
    }
}

运行结果如下所示:

姓名:张三
性别:男
出生日期:2000/1/1 0:00:00

5、全局配置JSON

上面的代码是在单个方法中设置JSON操作属性,如果当前存在很多方法,则必然会导致代码臃肿。我们可以在全局对JSON进行配置,代码如下:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace App
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers().AddJsonOptions(options =>
            {
                // 设置编码格式
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping;

                // 是否格式化文本
                options.JsonSerializerOptions.WriteIndented = true;

                // 添加时间格式化转换器
                options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter());

                // 字段采用驼峰式命名
                options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

                // 忽略null值
                options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;

                // 忽略只读字段
                options.JsonSerializerOptions.IgnoreReadOnlyProperties = true;

                // 允许属性值末尾存在逗号
                options.JsonSerializerOptions.AllowTrailingCommas = true;

                // 处理循环引用类型
                options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

在全局进行配置后,Controller中的方法就不需要单独配置了,代码如下:

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        [HttpGet]
        public JsonResult Get()
        {
            List<Person> list = new List<Person>
            {
                new Person { Id = 1, PersonName = "张三", PersonGender = "男", BirthOfDate = new DateTime(2000, 1, 1, 0, 0, 0) },
                new Person { Id = 2, PersonName = "李四", PersonGender = "女", BirthOfDate = new DateTime(2000, 2, 2) },
                new Person { Id = 3, PersonName = "王五", PersonGender = "男", BirthOfDate = new DateTime(2000, 3, 3) }
            };
            return new JsonResult(list);
        }
    }
}

运行结果如下所示:

[
  {
    "id": 1,
    "personName": "张三",
    "personGender": "男",
    "birthOfDate": "2000年01月01日 00时00分00秒"
  },
  {
    "id": 2,
    "personName": "李四",
    "personGender": "女",
    "birthOfDate": "2000年02月02日 00时00分00秒"
  },
  {
    "id": 3,
    "personName": "王五",
    "personGender": "男",
    "birthOfDate": "2000年03月03日 00时00分00秒"
  }
]

6、结语

本文简单介绍了ASP.NET Core中关于JSON序列化和反序列化操作,主要通过System.Text.Json来实现。如果你觉得微软提供的JSON序列化工具不好用,那也可以使用Newtonsoft.Json,我也会在下一篇博客中介绍关于Newtonsoft.Json的使用方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《王道》操作系统整理

操作系统第1章 OS概述第1节 OS基本概念第2节 OS发展与分类第3节 OS运行机制和体系结构1.3.1 操作系统的运行机制1. 时钟管理2. 中断机制3. 原语4. 系统资源管理或系统控制的数据结构及处理1.3.2 中断和异常1.3.3 系统调用第2章 进程管理第3章 内存管理第4章 文件管理第5章 IO管…

【8】SCI易中期刊推荐——计算机 | 人工智能(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

【SpringCloud11】Hystrix断路器

Hystrix断路器1.概述1.1分布式系统面临的问题1.2Hystrix 是什么1.3Hystrix 的作用1.4官网资料1.5Hystrix官宣停更进维2.Hystrix重要概念2.1服务降级&#xff08;fallback&#xff09;2.2服务熔断&#xff08;break&#xff09;2.3服务限流&#xff08;flowlimit&#xff09;3.H…

手把手教你使用Python实现推箱子小游戏(附完整源码)

文章目录项目介绍项目规则项目接口文档项目实现过程前置方法编写move核心方法编写项目收尾项目完善项目整体源码项目缺陷分析项目收获与反思项目介绍 我们这个项目是一个基于Python实现的推箱子小游戏&#xff0c;名叫Sokoban&#xff1a; 这个游戏的目的是让玩家&#xff0…

jfow-代码分析

jfow-代码分析目录概述需求&#xff1a;设计思路实现思路分析1.代码&#xff1a;2.代码2&#xff1a;3.CashFrmTemplate4.chartType5.DataColumnData:参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xf…

Vue实战第1章:学习和使用vue-router

学习和使用vue-router 前言 本篇在讲什么 简单讲解关于vue-router的使用 仅介绍简单的应用&#xff0c;仅供参考 本篇适合什么 适合初学Vue的小白 适合想要自己搭建网站的新手 适合没有接触过vue-router的前端程序 本篇需要什么 对Html和css语法有简单认知 对Vue有…

2023/1/14 js基础学习

1 js基础学习-基本数据类型基本语法 请参考 https://blog.csdn.net/m0_48964052?typeblog https://gitee.com/hongjilin/hongs-study-notes/blob/master/%E7%BC%96%E7%A8%8B_%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/HTMLCSSJS%E5%9F%BA%E…

Arthas 入门到实战(二)在线热更新

1. 结合 jad/mc 命令在线修改使用 jad 命令: 将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码&#xff0c;便于你理解业务逻辑&#xff1b; mc命令&#xff1a;Memory Compiler/内存编译器&#xff0c;编译.java文件生成.class。 redefine命令&#xff1a;加载…

unix进程控制及进程环境--自APUE

文章目录概述1、孤儿进程和僵尸进程进程终止进程的编译和启动进程终止的步骤进程8种终止方式进程退出函数1&#xff1a;exit进程退出函数2&#xff1a;_exit进程退出函数3&#xff1a;_Exit注册终止处理程序&#xff1a;atexit环境变量通过main函数传参全局的环境变量表&#x…

uni-app跨端自定义指令实现按钮权限

前言 初看这个标题可能很迷&#xff0c;uni-app明明不支持自定义指令&#xff0c;这文章是在搞笑吗&#xff0c;本文对于uni-app自定义指令实现按钮权限的方式也有可能是多余&#xff0c;但为了给业务部门更友好的开发体验&#xff0c;还是做了一些可能没意义的操作&#xff0…

回顾2022,展望 2023

个人相关&#xff1a; PMP 因为疫情多次延期的PMP终于搞定&#xff0c;光环的PMP就是妥妥。基本只要认真做题和思考都会过。但是考试不仅仅是考试&#xff0c;有时候更多的是对项目发展和项目管理的思考&#xff1a;风险&#xff0c;里程碑&#xff0c;相关方&#xff0c;敏捷&…

红日内网渗透靶场2

目录 环境搭建&#xff1a; Web渗透&#xff1a; weblogic漏洞利用 java反序列化漏洞利用、哥斯拉获取shell 上线msf msf派生shell到cs 内网信息收集 mimikatz获取用户密码 cs横向移动 PTT攻击&#xff08;票据传递&#xff09; 方法2&#xff1a;通过msf利用永恒之蓝…

测试之分类【测试对象、是否查看代码、开发】

文章目录1. 按测试对象分类2. 按照是否查看代码划分3. 按照开发阶段划分1. 按测试对象分类 可靠性测试容错性测试安装卸载测试内存泄露测试弱网测试 &#xff08;1&#xff09;可靠性测试 可靠性 正常运行时间 / (正常运行时间 非正常运行时间) * 100% &#xff08;最高 10…

Servlet的实战用法(表白墙前后端)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 服务器版本的表白墙 创建项目 约定前后端交互接口 获取全部留言 发表新的留言 服务端代码 创建Message类 创建DBUtil类 创建MessageServlet…

双指针合集

87合并两个有序的数组 import java.util.*; public class Solution {public void merge(int A[], int m, int B[], int n) { int i m-1;int j n-1;for(int k nm-1;k>0;k--){if(j<0) A[k] A[i--];else if(i<0) A[k] B[j--];else if(A[i]>B[j]) A[k] A[i--]…

六道数据结构算法题详解

目录 1.力扣350题. 两个数组的交集 II 2.力扣121题. 买卖股票的最佳时机 3.力扣566题. 重塑矩阵 4.力扣118题. 杨辉三角 5.牛客BM13 判断一个链表是否为回文结构 6.牛客BM14 链表的奇偶重排 1.力扣350题. 两个数组的交集 II 题目&#xff1a;给你两个整数数组 nums1 和 n…

2022年终总结---权衡好工作和生活

2022总结 【校园】2022年6月研究生顺利毕业&#xff0c;让下文的一切才变的有机会。感谢师弟送学长毕业&#xff0c;感谢在最后时刻各位舍友帮忙送材料&#xff0c;怀念最后一个月一起打球的时光。 【工作】2022年6月入职阿里&#xff0c;成为打工人。在这个大的平台&#xf…

Goland项目使用gomod配置

Goland 项目创建 goland2020.3 及以上 IDE&#xff0c;默认创建的 go 项目 就是使用 gomod 管理&#xff01; goland2020.3 及以下的 IDE&#xff0c;创建项目时需要选择 带小括号 vgo 的才是 gomod 管理模式 下图为使用 goland2021.3 版本创建使用 gomod 管理的 go 项目&…

14种可用于时间序列预测的损失函数

在处理时间序列预测问任务时&#xff0c;损失函数的选择非常重要&#xff0c;因为它会驱动算法的学习过程。以往的工作提出了不同的损失函数&#xff0c;以解决数据存在偏差、需要长期预测、存在多重共线性特征等问题。本文工作总结了常用的的 14 个损失函数并对它们的优缺点进…

线段树(Segment tree)

线段树 线段树是一种二叉树形数据结构,用以储存区间或线段,并且允许快速查询结构内包含某一点的所有区间。 视频讲解 线段树主要实现两个方法:「求区间和」&「修改区间」,且时间复杂度均为 O(logn)。 nums = [1, 2, 3, 4, 5] 对应的线段树如下所示: 使用数组表示线段…