• System.Text.Json 常规用法


    安装 System.Text.Json

    • 如果项目是.NET Core。需要.netcore 3.0及以上版本。

    • 如果项目是.NET Standard或.NET Framework。需要安装System.Text.JsonNuGet包。

    常用using

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

    常用方法

    Utf8JsonReader - 读操作,快速,低级
    Utf8JsonWriter - 写操作,快速,低级
    JsonDocument - 基于DOM解析,快速
    JsonSeriliazer - 串行化/反串行化,快速

    序列化

    //序列化  对象 -> JSON 字符串
    string json = JsonSerializer.Serialize(object);
    
    //分序列化 JSON 字符串 -> 对象
    var obj = JsonSerializer.Deserialize<object>(json);

    特性

    [JsonPropertyName("temp")]
    [JsonIgnore]// 不序列化这个属性
    [DisplayName("学生")]
    public string Student { get; set; }

    全局配置

      public void ConfigureServices(IServiceCollection services)
            {        
    services.AddControllers()
            .AddJsonOptions(options =>
            {
                // 整齐打印
                options.JsonSerializerOptions.WriteIndented = true;
                // 忽略值为Null的属性
                options.JsonSerializerOptions.IgnoreNullValues = true;
                // 设置Json字符串支持的编码,默认情况下,序列化程序会转义所有非 ASCII 字符。 即,会将它们替换为 \uxxxx,其中 xxxx 为字符的 Unicode
                // 代码。 可以通过设置Encoder来让生成的josn字符串不转义指定的字符集而进行序列化 下面指定了基础拉丁字母和中日韩统一表意文字的基础Unicode 块
                // (U+4E00-U+9FCC)。 基本涵盖了除使用西里尔字母以外所有西方国家的文字和亚洲中日韩越的文字
                options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs);
                // 反序列化不区分大小写
                options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
                // 驼峰命名
                options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
                // 对字典的键进行驼峰命名
                options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
                // 序列化的时候忽略null值属性
                options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
                // 忽略只读属性,因为只读属性只能序列化而不能反序列化,所以在以json为储存数据的介质的时候,序列化只读属性意义不大
                options.JsonSerializerOptions.IgnoreReadOnlyFields = true;
                // 不允许结尾有逗号的不标准json
                options.JsonSerializerOptions.AllowTrailingCommas = false;
                // 不允许有注释的不标准json
                options.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Disallow;
                // 允许在反序列化的时候原本应为数字的字符串(带引号的数字)转为数字
                options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString;
                // 处理循环引用类型,比如Book类里面有一个属性也是Book类
                options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
            });
    }

    解析JSON

    JsonDocument和RootElement

                //创建一个对象
                var Object = new
                {
                    code = 0,
                    msg = "success",
                    data = new
                    {
                        total = 3,
                        details = new { codes = new string[] { "1", "2", "3" } }
                    }
                };
                //对象转字符串
                var json = JsonSerializer.Serialize(Object);
                
                using JsonDocument jsondocument = JsonDocument.Parse(json);
                var rootElement = jsondocument.RootElement;
    
                var msg = rootElement.GetProperty("msg").GetString();
                Console.WriteLine(msg);
    
                var array = rootElement.GetProperty("data").GetProperty("details").GetProperty("codes").EnumerateArray();
                foreach (var arr in array)
                    Console.WriteLine(arr.GetString());

    输出

    success
    1
    2
    3

    JsonNode

     需要net 6.0 及以上版本           

                var obj = new
                {
                    code = 0,
                    msg = "success",
                    data = new
                    {
                        total = 3,
                        details = new { codes = new string[] { "1", "2", "3" } }
                    }
                };
                var json = JsonSerializer.Serialize(obj);
                var jsonNode = JsonNode.Parse(json);
                var msg = jsonNode["msg"].ToString();
                int code = jsonNode["code"].GetValue<int>();
                string two = jsonNode["data"]["details"]["codes"][1].ToString();
    Console.WriteLine(msg); Console.WriteLine(code);
    Console.WriteLine(two);
                Console.WriteLine("---------------------------------------------------------");
                var list = jsonNode["data"]["details"]["codes"].Deserialize<string[]>();
    
                foreach (var item in list)            
                    Console.WriteLine(item);

    输出

    success
    0
    2
    ---------------------------------------------------------
    1
    2
    3

  • 相关阅读:
    Linux CentOS7.0 (04)systemctl vs chkconfig、service
    SpringCloud是否值得引入?
    SpringCloud的Hystrix(二) 某消费者应用(如:ui、网关)访问的多个微服务的断路监控
    SpringCloud的Hystrix(一) 一个消费者内的两个服务监控
    SpringCloud的Bus(一)消息中间件的概念和用途
    api-gateway实践(13)新服务网关
    SpringCloud应用入库后乱码问题
    SpringCloud的应用发布(四)vmvare+linux,网关代理
    SpringCloud的DataRest(四)restful特性展示
    win10 如何让其他机器访问自己机器上的mysql
  • 原文地址:https://www.cnblogs.com/RainFate/p/15720684.html
Copyright © 2020-2023  润新知