目录
通过JsonSerializerOptions进行序列化设置
在本文中,我向您展示JSON的基本操作。这是学习C#的关键主题之一。
介绍
如今,JSON已成为代表复杂结构和数据交换的主要格式之一。因此,所有主要的编程语言都具有使用它的内置支持。C#也不例外。在本文中,我想向您介绍一种在C#/.NET中使用JSON文件的简单方法。我想向您展示这种格式的简单示例。
背景
至少有两种主要方法将.NET对象转换为JSON:
- 使用DataContractJsonSerializer类
- 使用JsonSerializer类
让我们看看JsonSerializer类。此类允许您将对象序列化为JSON,反之,则可以将JSON代码反序列化为C#对象。
为了将对象保存为JSON,JsonSerializer类定义了一个名为Serialize()的static方法,该方法具有许多重载。他们之中有一些是:
string Serialize <T> (T obj, JsonSerializerOptions options)
类型化版本会序列化T类型的obj对象,并以string形式返回JSON代码。
string Serialize (Object obj, Type type, JsonSerializerOptions options)
序列化obj,type type并将JSON代码返回为string。最后一个可选参数options允许您指定其他序列化选项。
Task SerializeAsync (Object obj, Type type, JsonSerializerOptions options)
序列化obj,type type并将JSON代码返回为string。最后一个可选参数options允许您指定其他序列化选项。
Task SerializeAsync <T> (T obj, JsonSerializerOptions options)
类型化版本会序列化T类型的obj object,并以string形式返回JSON代码。
object Deserialize (string json, Type type, JsonSerializerOptions options)
将JSON string反序列化为type type的object,然后返回反序列化的对象。最后一个可选参数options允许您指定其他反序列化选项。
T Deserialize <T> (string json, JsonSerializerOptions options)
将json string反序列化为类型T的object并返回。
ValueTask <object> DeserializeAsync
(Stream utf8Json, Type type, JsonSerializerOptions options, CancellationToken token)
将表示JSON对象的UTF-8文本反序列化为type type的object。最后两个参数是可选的:options允许您设置其他反序列化选项,而token设置CancellationToken以取消任务。返回object包装在ValueTask中的反序列化。
ValueTask <T> DeserializeAsync <T>
(Stream utf8Json, JsonSerializerOptions options, CancellationToken token)
将表示JSON object的UTF-8文本反序列化为一个type T的object。返回object包装在ValueTask中的反序列化。
获取新的JSON库
- 如果您以.NET Core为目标。安装最新版本的NET Core 。这为您提供了新的JSON库和ASP.NET Core集成。
- 如果您以.NET Standard或.NET Framework为目标。安装System.Text.Json NuGet软件包(确保包括预览并安装版本4.6.0-preview6.19303.8或更高版本)。为了与ASP.NET Core集成,必须以.NET Core 3.0为目标。
兴趣点
让我们通过一个简单的示例来考虑使用该类。序列化和反序列化最简单的object:
class Cellphone
{
public string Name { get; set; }
public float Price { get; set; }
}
class Program
{
static void Main(string[] args)
{
Cellphone cellphone1 = new Cellphone { Name = "Iphone 12", Price = 750.00f };
string json = JsonSerializer.Serialize<Cellphone>(cellphone1);
Console.WriteLine(json);
Cellphone restoredcellphone = JsonSerializer.Deserialize<Cellphone>(json);
Console.WriteLine(restoredcellphone.Name +" "+
Convert.ToString( restoredcellphone.Price));
Console.ReadLine();
}
在本例中,我们使用类型Cellphone的object,然后这个object通过JsonSerializer.Serialize()方法序列化。然后,我们使用JsonSerializer.Deserialize()方法从object中的JSON进行反序列化Cellphone类型。在图1中,我们得到结果:
图1 – JsonSerializer.Serialize()和JsonSerializer.Deserialize()方法的结果。
此外,对于序列化/反序列化,我们可以使用一种结构。
(带有public修饰符的)仅object的public属性可以进行序列化。
被反序列化的object必须有无参数的构造函数。例如,在上面的示例中,这是默认的构造函数,但是您也可以在类中显式定义类似的构造函数。
编写和读取JSON文件
我们可以创建一个JSON文件,因为SerializeAsyc/DeserializeAsync可以接受stream以保存和写入数据。让我们考虑一个实例。
class Cellphone
{
public string Name { get; set; }
public float Price { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
using (FileStream fs = new FileStream("cellphone.json", FileMode.OpenOrCreate))
{
Cellphone cellphone1 = new Cellphone { Name = "Iphone 12", Price = 750.00f };
await JsonSerializer.SerializeAsync<Cellphone>(fs, cellphone1);
Console.WriteLine("We are done.File has benn saved");
}
using (FileStream fs = new FileStream("cellphone.json", FileMode.OpenOrCreate))
{
Cellphone restoredcellphone1 =
await JsonSerializer.DeserializeAsync<Cellphone>(fs);
Console.WriteLine($"Name: {restoredcellphone1.Name}
Price: {restoredcellphone1.Price}");
}
Console.ReadLine();
}
}
在这里,我们使用using因为FileStream是不受控制的资源,并且Data已被读写。
通过JsonSerializerOptions进行序列化设置
默认情况下,将JsonSerializer序列化为object最小代码。使用诸如JsonSerializerOptions的附加软件包,您可以使用JsonSerializerOptions属性来自定义序列化/反序列化引擎。其某些属性如下所示:
- IgnoreReadOnlyProperties:简单地设置只读属性是否被序列化
- IgnoreNullValues:设置是否在json对象及其属性中序列化/反序列化为 null
- WriteIndented:设置是否在json中添加空格(相对而言,为了美观)。如果设置正确,多余的空格
- AllowTrailingCommas:是否在json的最后一个逗号后添加逗号的元素。如果等于true,则添加逗号
使用属性自定义序列化
默认情况下,所有public属性都已序列化。另外,在输出json对象中,所有属性名称都与C#对象的属性名称匹配。但是,使用JsonIgnore和JsonPropertyName属性。
该JsonIgnore属性使您可以从序列化中排除特定属性。JsonPropertyName允许您覆盖原始属性名称。让我们考虑一个例子:
class Cellphone
{
[JsonPropertyName("NameOfCellPhone")]
public string Name { get; set; }
[JsonIgnore]
public float Price { get; set; }
}
class Program
{
static void Main(string[] args)
{
Cellphone cellphone1 = new Cellphone() { Name = "Iphone 12", Price = 750.00f };
string json = JsonSerializer.Serialize<Cellphone>(cellphone1);
Console.WriteLine(json);
Cellphone restoredPerson = JsonSerializer.Deserialize<Cellphone>(json);
Console.WriteLine($"CellPhone: {restoredPerson.Name}
Price: {restoredPerson.Price}");
Console.ReadLine();
}
结果在图像2上。
图片2-JsonIgnore的结果
在这种情况下,该Price属性将被忽略,并且将使用“NameOfCellPhone”别名作为该CellPhone属性。请注意,由于Priceproperty尚未序列化,因此在反序列化时会使用其默认值。
总之,JSON是表示复杂结构和数据交换的主要格式之一。此外,所有主要的编程语言都具有使用它的内置支持,C#也不例外。
https://www.codeproject.com/Tips/5295019/Working-With-JSON-In-Csharp