.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

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();
}
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);
}
2019-9-16增加:
JsonDocument只是命名空间调整了,API并没有改变,使用上没有改变。
总结
在项目中,经常用到是JsonSerializer和JsonDocument,虽然没有直接用到Utf8JsonReader和Utf8JsonWriter,但在JsonSerializer内部是基于Utf8JsonReader和Utf8JsonWriter来实现的.
秋风
2019-06-22