System.Text.Json 使用

参考:https://www.cnblogs.com/RainFate/p/15720684.html

在.NET Core 3.0中加入了对JSON的内置支持

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

 1.读取与写入

1
2
3
4
5
6
7
// 读取
var str = File.ReadAllText(fileName);
var data = JsonSerializer.DeserializeObject<List<Demo>>(str);
 
// 写入
str = JsonSerializer.Serialize(DemoEntity);
File.WriteAllText(fileName, str);

 2.格式化json字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <summary>
/// 格式化JSON字符串
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string ToJsonString<T>(this T obj)
{
    if (obj != null)
    {
        var setting = new JsonSerializerOptions
        {
            WriteIndented = true,
        };
        return JsonSerializer.Serialize(obj, setting);
    }
    return string.Empty;
}

 3.反序列化

1
2
3
4
public static T ToObject<T>(this string jsonStr)
{
    return JsonSerializer.Deserialize<T>(jsonStr);
}

 4.小驼峰格式反序列化

/// <summary>
/// 小驼峰格式序列化。
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="entity">类型对象</param>
/// <returns></returns>
public static string SerializeWithCamel<T>(this T entity)
{
    // 小驼峰序列化
    var setting = new JsonSerializerOptions
    {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    };
    return JsonSerializer.Serialize(entity, setting);
}

 5.小驼峰格式反序列化

/// <summary>
/// 小驼峰格式反序列化。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="str"></param>
/// <returns></returns>
public static T DeserializeWithCamel<T>(this string str)
{
    if (str != null)
    {
        // 小驼峰序列化
        var setting = new JsonSerializerOptions
        {
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase
        };
        return JsonSerializer.Deserialize<T>(str, setting);
    }
    else
    {
        return default(T);
    }
}

 序列化时要求输出值都默认带双引号

1
2
3
4
string pattern = @":([0-9]{10,})";
MatchCollection matches = Regex.Matches(json, pattern);
Regex regex = new Regex(pattern);
var ouputStr = regex.Replace(json, ":\"$1\"");

 WebApi 自定义时间输出格式

1
2
3
4
5
6
7
8
9
10
11
12
public class DateTimeJsonConverter : JsonConverter<DateTime>
{
        public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            return DateTime.Parse(reader.GetString());
        }
  
        public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));
        }
}

  WebApi 自定义全小写输出格式

1
2
3
4
5
6
7
8
/// <summary>
/// 返回对象全小写
/// </summary>
public class LowercasePolicy : JsonNamingPolicy
{
    public override string ConvertName(string name) =>
        name.ToLower();
}

 

Program.cs 全局配置

1
2
3
4
5
builder.Services.AddControllers().AddJsonOptions(options =>
{
    //自定义输出的时间格式 options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter());  //自定义输出的全小写
    option.JsonSerializerOptions.PropertyNamingPolicy = new LowercasePolicy();
});

 其他配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
services.AddJsonOptions(options =>
{
              //格式化日期时间格式
              options.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverter());
              //数据格式首字母小写
              //options.JsonSerializerOptions.PropertyNamingPolicy =JsonNamingPolicy.CamelCase;
              //数据格式原样输出
              options.JsonSerializerOptions.PropertyNamingPolicy = null;
              //取消Unicode编码,解决后端返回数据中文被编码
              options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
              //忽略空值
              options.JsonSerializerOptions.IgnoreNullValues = true;
              //允许额外符号
              options.JsonSerializerOptions.AllowTrailingCommas = true;
              //反序列化过程中属性名称是否使用不区分大小写的比较
              options.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
});

 

posted @   microsoft-zhcn  阅读(596)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示