还有另外一种模式,可以不必设置例外而达到不转义的效果,这个模式就是“非严格JSON”模式,将上面的 JavaScriptEncoder.Create(encoderSettings) 替换为下面的代码
options.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping; 序列化相关-异步/流式System.Text.Josn 提供了一系列丰富的JSON互操作,这其中包含异步和流式处理,这点也是和 Newtonsoft.Json 最大的不同,但不管是那种方式,都要牢记,最后都是通过下面的两个类来实现
System.Text.Json.Utf8JsonReader System.Text.Json.Utf8JsonWriter 自定义 JSON 名称和值在默认情况下,输出的JSON属性名称保持和实体对象相同,包括大小写的都是一致的,枚举类型在默认情况下被序列化为数值类型。System.Text.JSON 提供了一系列的设置和扩展来帮助开发者实现各种自定义的需求。下面的代码可以设置默认的JSON属性名称,这个设置和 Newtonsoft.Json 基本一致。
public class UserInfo { [JsonPropertyName("name")] public string Name { get; set; } public decimal Money { get; set; } public int Age { get; set; } public string Remark { get; set; } }UserInfo 的 属性 Name 在输出为 JSON 的时候,其字段名称将为:name,其他属性保持大小写不变
对所有属性设置为 camel 大小写 var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; jsonSerializer.Serialize(user, options); 自定义名称策略比如我们的系统,目前采用全小写的模式,那么我可以自定义一个转换器,并应用到序列化行为中。
public class LowerCaseNamingPolicy : JsonNamingPolicy { public override string ConvertName(string name) => name.ToLower(); } var options = new JsonSerializerOptions(); // 应用策略 options.PropertyNamingPolicy = new LowerCaseNamingPolicy(); var user = new UserInfo { Name = "Ron", Money = 4.5m, Age = 30}; var json = JsonSerializer.Serialize(user, options); 将枚举序列化为名称字符串而不是数值 var options = new JsonSerializerOptions(); // 添加转换器 options.Converters.Add(new JsonStringEnumConverter()); var user = new UserInfo { Name = "Ron", Money = 4.5m, Age = 30; var json = JsonSerializer.Serialize(user, options); 排除不需要序列化的属性在默认情况下,所有公共属性将被序列化为JSON。 但是,如果你不想让某些属性出现在 JSON 中,可以通过下面的几种方式实现属性排除
排除所有属性值为 null 属性 var options = new JsonSerializerOptions(); options.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping; options.IgnoreNullValues = true; var user = new UserInfo { Name = "Ron", Money = 4.5m, Age = 30, Remark =null}; var json = JsonSerializer.Serialize(user, options); // 输出,可以看到,Remark 属性被排除 {"name":"Ron","Money":4.5,"Age":30} 排除指定标记属性可以为某个属性应用 JsonIgnore 特性,标记为不输出到 JSON
public class UserInfo { [JsonPropertyName("name")] public string Name { get; set; } public decimal Money { get; set; } [JsonIgnore]public int Age { get; set; } public string Remark { get; set; } } var user = new UserInfo { Name = "Ron", Money = 4.5m, Age = 30, Remark =null}; var json = JsonSerializer.Serialize(user); // 输出,属性 Age 已被排除 {"name":"Ron","Money":4.5,"Remark":null} 排除所有只读属性还可以选择对所有只读属性进行排查输出 JSON,比如下面的代码,Password 是不需要输出的,那么我们只需要将 Password 设置为 getter,并应用 IgnoreReadOnlyProperties = true 即可
public class UserInfo { [JsonPropertyName("name")] public string Name { get; set; } public decimal Money { get; set; } [JsonIgnore] public int Age { get; set; } public int Password { get; } public string Remark { get; set; } } var options = new JsonSerializerOptions { IgnoreReadOnlyProperties = true }; var user = new UserInfo { Name = "Ron", Money = 4.5m, Age = 30, Remark = null }; var json = JsonSerializer.Serialize(user, options); // 输出 {"name":"Ron","Money":4.5,"Remark":null} 排除派生类的属性