目录
介绍
背景
获取新的JSON库
兴趣点
编写和读取JSON文件
通过JsonSerializerOptions进行序列化设置
使用属性自定义序列化
在本文中,我向您展示JSON的基本操作。这是学习C#的关键主题之一。
介绍如今,JSON已成为代表复杂结构和数据交换的主要格式之一。因此,所有主要的编程语言都具有使用它的内置支持。C#也不例外。在本文中,我想向您介绍一种在C#/.NET中使用JSON文件的简单方法。我想向您展示这种格式的简单示例。
背景至少有两种主要方法将.NET对象转换为JSON:
- 使用DataContractJsonSerializer类
- 使用JsonSerializer类
让我们看看JsonSerializer类。此类允许您将对象序列化为JSON,反之,则可以将JSON代码反序列化为C#对象。
为了将对象保存为JSON,JsonSerializer类定义了一个名为Serialize()的static方法,该方法具有许多重载。他们之中有一些是:
string Serialize (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 obj, JsonSerializerOptions options)
类型化版本会序列化T类型的obj object,并以string形式返回JSON代码。
object Deserialize (string json, Type type, JsonSerializerOptions options)
将JSON string反序列化为type type的object,然后返回反序列化的对象。最后一个可选参数options允许您指定其他反序列化选项。
T Deserialize (string json, JsonSerializerOptions options)
将json string反序列化为类型T的object并返回。
ValueTask DeserializeAsync
(Stream utf8Json, Type type, JsonSerializerOptions options, CancellationToken token)
将表示JSON对象的UTF-8文本反序列化为type type的object。最后两个参数是可选的:options允许您设置其他反序列化选项,而token设置CancellationToken以取消任务。返回object包装在ValueTask中的反序列化。
ValueTask DeserializeAsync
(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(cellphone1);
Console.WriteLine(json);
Cellphone restoredcellphone = JsonSerializer.Deserialize(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(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(fs);
Console.WriteLine($"Name: {restoredcellphone1.Name}
Price: {restoredcellphone1.Price}");
}
Console.ReadLine();
}
}
在这里,我们使用using因为FileStream是不受控制的资源,并且Data已被读写。
默认情况下,将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(cellphone1);
Console.WriteLine(json);
Cellphone restoredPerson = JsonSerializer.Deserialize(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