序列化

.NET6库自带了Json序列化相关类库,示例如下

public class Person
{
    public string Name { get; set; }

    public string Sex { get; set; }

    public int Age { get; set; }
}

...

Person person = new Person {Name = "coco", Sex = "男", Age = 18};
//将对象序列化为json字符串
var json = JsonSerializer.Serialize(person);
Console.WriteLine(json);

输出结果过如下

image-20221202143641008

会将汉字转换为Unicode编码。

反序列化

string json ="{\"Name\":\"coco\",\"Sex\":\"\u7537\",\"Age\":18}";
//使用泛型约束反序列化类型
var person = JsonSerializer.Deserialize<Person>(json);
Console.WriteLine($"person.Name:{person.Name}");
Console.WriteLine($"person.Sex:{person.Sex}");
Console.WriteLine($"person.Age:{person.Age}");

输出结果如下

image-20221202171121781

使用Configuration方式读取json节点

.NET使用通常使用json文件来存储程序的配置内容,使用序列化的方式来读取配置还需要定义配置实体类,不是很方便,因此提供了IConfiguration接口来提供json文件读取操作,首先安装依赖

  • Microsoft.Extensions.Configuration.Json

使用示例

var config = new ConfigurationBuilder().SetBasePath(AppContext.BaseDirectory).AddJsonFile("person.json").Build();
Console.WriteLine(config["Name"]);

绑定一个json文件作为配置源,使用数组索引访问的方式来读取配置节点,如果节点层级较深可以采用config["A:B:C"]的形式来读取配置节点(A节点下B节点中的C节点内容)。

使用JsonNode来读取json文件

JsonNode也是.NET6的原生类库,使用示例如下

//读取json文件内容
var json = File.ReadAllText(AppContext.BaseDirectory + "person.json");
//解析json字符串
var node = JsonNode.Parse(json);
//读取节点
Console.WriteLine(node!["Name"]);

和Configuration读取节点配置不一样,深层节点的读取方式如下

node["A"]["B"]["C"]

因为node["A"]返回的值还是一个node节点

使用JsonNode来修改json文件

JsonNode的节点属性是支持修改的,因此修改json节点内容的思路就是先读取json字符串并解析为JsonNode类,修改节点内容,重新写入到文件即可