前言
JSON(JavaScript Object Notation)是一种基于文本,独立于语言的轻量级数据交换格式,它易于阅读和编写,并且易于机器解析和生成。现已成为各种应用程序之间数据交换和通信的主流数据格式。在 .NET 通过三方库如 Newtonsoft.Json 或者 System.Text.Json 实现JSON的序列化与反序列化,本文一起了解 System.Text.Json 序列化与反序列化基础用法。
System.Text.Json
1、概述
System.Text.Json 是 C# 中的一个 JSON 序列化和反序列化库,从 .NET Core 3.0及更高版本中,通过内置方式提供支持。如果在.NET Framework 4.7及更高版本中,使用可通过NuGet包管理器安装 System.Text.Json。
2、常用的类
JsonSeriliazer:提供将对象或值类型序列化为 JSON 以及将 JSON 反序列化为对象或值类型的功能;
JsonDocument: 提供用于检查 JSON 值的结构内容,而不自动实例化数据值的机制;
JsonSerializerOptions: 提供与 JsonSerializer 一起使用的选项;
3、序列化
JSON 序列化是将对象或值类型转化为JSON格式的文本内容的过程。下面是一个简单的示例:
using System;
using System.Text.Encodings.Web;
using System.Text.Json;
namespace Fountain.WinConsole.JSONDemo
{
internal class Program
{
static void Main(string[] args)
{
// 定义一个对象
Address address = new Address
{
Province = "广东省",
City = "深圳市",
District="罗湖区",
Town= "莲塘街道",
Detail= "梧桐山公园"
};
// 配置 JsonSerializer 使用的选项 此处配置支持中文不转义
var options = new JsonSerializerOptions
{
// 允许字符通过而不进行转义方面更加宽松
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
}
// 将对象序列化为JSON
string json= JsonSerializer.Serialize(address, options);
// 输出 JSON
Console.WriteLine(json);
//
Console.ReadKey();
}
}
}
4、反序列化
JSON 反序列化是将 JSON 格式的文本内容转换回 .NET 对象或值类型的过程。下面是一个简单的示例:
using System;
using System.Text.Encodings.Web;
using System.Text.Json;
namespace Fountain.WinConsole.JSONDemo
{
internal class Program
{
static void Main(string[] args)
{
// 配置 JsonSerializer 使用的选项 此处配置支持中文不转义
var options = new System.Text.Json.JsonSerializerOptions
{
// 允许字符通过而不进行转义方面更加宽松
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
// JSON 格式文本内容
string jsonString = "{\"City\":\"深圳市\",\"Detail\":\"梧桐山公园\",\"District\":\"罗湖区\",\"Province\":\"广东省\",\"Town\":\"莲塘街道\"}";
// 将 JSON 反序列化为对象
var addr = JsonSerializer.Deserialize<Address>(jsonString);
Console.WriteLine(addr.Province);
// 或
var Address = JsonSerializer.Deserialize<Address>(jsonString, options);
Console.ReadKey();
}
}
}
5、配置选项
通过使JsonSerializerOptions类配置选项,告诉JsonSerializer如何序列化和反序列化JSON。下面示例是一些选项使用:
var options = new JsonSerializerOptions
{
// 整齐打印
WriteIndented = true,
// 关闭转义,默认情况下,序列化程序会转义所有非 ASCII 字符。即,会将中文替换为 \uxxxx,其中 xxxx 为字符的 Unicode 代码。
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
// 反序列化不区分大小写
PropertyNameCaseInsensitive = true,
// 驼峰命名
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
// 对字典的键进行驼峰命名
DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
// 序列化的时候忽略null值属性
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
// 忽略只读属性,因为只读属性只能序列化而不能反序列化,所以在以json为储存数据的介质的时候,序列化只读属性意义不大
IgnoreReadOnlyFields = true,
// 不允许结尾有逗号的不标准json
AllowTrailingCommas = false,
// 不允许有注释的不标准json
ReadCommentHandling = JsonCommentHandling.Disallow,
// 允许在反序列化的时候原本应为数字的字符串(带引号的数字)转为数字
NumberHandling = JsonNumberHandling.AllowReadingFromString,
// 处理循环引用类型
ReferenceHandler = ReferenceHandler.IgnoreCycles,
// 类型转换
Converters =
{
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
}
};
6、自定义转换器
System.Text.Json 提供了JSON序列化类创建自定义转换器,转换器是一种将对象或值与 JSON 相互转换的类。我们可以编写自定义转换器来替代内置转换器的默认行为。(本文不展开详细的描述)
7、解析 JSON
使用 JsonDocument 类可对JSON文本内容进行解析。下面是一个简单的示例:
using System;
using System.Text.Encodings.Web;
using System.Text.Json;
namespace Fountain.WinConsole.JSONDemo
{
internal class Program
{
static void Main(string[] args)
{
// JSON 文本内容
string jsonString = "{\"City\":\"深圳市\",\"Detail\":\"梧桐山公园\",\"District\":\"罗湖区\",\"Province\":\"广东省\",\"Town\":\"莲塘街道\"}";
// 创建 JsonDocument 对象
using (JsonDocument jsondocument = JsonDocument.Parse(jsonString))
{
var rootElement = jsondocument.RootElement;
//
var city = rootElement.GetProperty("City").GetString();
Console.WriteLine(city);
//
var Detail = rootElement.GetProperty("Detail").GetString();
Console.WriteLine(Detail);
}
Console.ReadKey();
}
}
}
小结
以上是C#使用System.Text.Json序列化与反序列化基础用法,其使用还是比较容易的。希望本文对您有所收获,如有不到之处,请多多包涵。
该文章在 2024/11/7 10:31:27 编辑过