.Net Core 3.0 使用新的Json API

起因

因为在前面遇到 Asp.Net Core Mvc JsonResult问题 这个问题,正好看了一下新的Json API,对新的API学习一下.毕竟.Net Core移除默认的Json.Net,改为System.Text.Json,不管在性能和内存上,比Json.Net 都有很大的提升,新的Json API得益于Span<byte>.

先认识这几个API

认识新的Json API函数

JsonSerializer 使用

/// <summary>
/// 测试类
/// </summary>
public class People
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Sex { get; set; }

    public int Age { get; set; }

    public string IdCard { get; set; }

    public readonly int myval = 4;
}


private static void Main(string[] args)
{
    // JsonSerializer

    int count = 3;

    string[] sex = new string[] { "男", "女" };

    Random random = new Random();
    var list = new List<People>();
    for (int i = 0; i < count; i++)
    {
        list.Add(new People()
        {
            Id = i + 1,
            Name = "tom" + (i + 1),
            Sex = sex[random.Next(0, 1)],
            Age = random.Next(1, 110)
        });
    }

    list.Add(new People() { });                                 //添加一个空对象

    JsonSerializerOptions options = new JsonSerializerOptions()
    {
        WriteIndented = true,                                   //格式化json字符串
        AllowTrailingCommas = true,                             //可以结尾有逗号
        //IgnoreNullValues = true,                              //可以有空值,转换json去除空值属性
        IgnoreReadOnlyProperties = true,                        //忽略只读属性
        PropertyNameCaseInsensitive = true,                     //忽略大小写
        //PropertyNamingPolicy = JsonNamingPolicy.CamelCase     //命名方式是默认还是CamelCase
    };

    //对象转为json 字符串
    string json = JsonSerializer.ToString<IList<People>>(list, options);   //在.Net Core 3.0正式版,ToString API改为Serialize
    Console.WriteLine(json);

    //json字符串转为集合
    var peopleList = JsonSerializer.Parse<IList<People>>(json);           //在.Net Core 3.0正式版,Parse API改为Deserialize
    Console.WriteLine(peopleList.Count);

    Console.ReadKey();
}

JsonSerializer 测试数据

2019-9-16修改:

在.Net Core 3.0.100-preview9-014004,这是预览第9个版本,候选第二个(rc2),距离发布.Net Core 3.0正式版也只有一周多的时间。

//JSON API 命名空间也改变了
//string result = System.Text.Json.Serialization.JsonSerializer.ToString(new { success = true, msg = "ok" });
//List<People> peoples = System.Text.Json.Serialization.JsonSerializer.Parse<IList<People>>();

//改为熟悉的Serialize和Deserialize 转为json和反序列为集合
string json = System.Text.Json.JsonSerializer.Serialize(list); 
List<People> peoples = System.Text.Json.JsonSerializer.Deserialize<List<People>>(json);

JsonDocument 使用

测试数据
[
  {
    "Id": 1,
    "Name": "tom1",
    "Sex": "\u7537",
    "Age": 82,
    "IdCard": null
  },
  {
    "Id": 2,
    "Name": "tom2",
    "Sex": "\u7537",
    "Age": 14,
    "IdCard": null
  },
  {
    "Id": 3,
    "Name": "tom3",
    "Sex": "\u7537",
    "Age": 7,
    "IdCard": null
  },
  {
    "Id": 0,
    "Name": null,
    "Sex": null,
    "Age": 0,
    "IdCard": null
  }
]
string json = File.ReadAllText("test.json", Encoding.UTF8);

using (JsonDocument doc = JsonDocument.Parse(json))
{
    int sum = 0;
    var elemArray = doc.RootElement.EnumerateArray();
    foreach (JsonElement item in elemArray)
    {
        int age = item.GetProperty("Age").GetInt32();   //获取Age属性
        sum += age;
    }

    Console.WriteLine(sum);
}

JsonDocument解析json像解析xml一样

2019-9-16增加:

JsonDocument只是命名空间调整了,API并没有改变,使用上没有改变。

总结

在项目中,经常用到是JsonSerializer和JsonDocument,虽然没有直接用到Utf8JsonReader和Utf8JsonWriter,但在JsonSerializer内部是基于Utf8JsonReader和Utf8JsonWriter来实现的.
秋风 2019-06-22