net中使用json(.NET自带的高性能)
net中使用json(.NET自带的高性能)JsonElement root = doc.RootElement; 我们获取对具有属性的根元素的引用。RootElementusing JsonDocument doc = JsonDocument.Parse(data); 我们将 JSON 字符串解析为 .JsonDocument将流解析为 UTF-8 编码数据,表示单个 JSON 值到 .流被读取完成。JsonDocument.ParseJsonDocument程序.csusing System.Text.Json; string data = @" [ {""name"": ""John Doe"" ""occupation"": ""gardener""} {""
System.Text.JSON 命名空间提供高性能、低分配和标准兼容的功能,以处理 JavaScript 对象表示法 (JSON),其中包括将对象序列化为 JSON 文本以及将 Json 文本反序列化为对象(内置 UTF-8 支持)。 它还提供类型以用于读取和写入编码为 Utf-8 的 JSON 文本,以及用于创建内存中文档对象模型 (DOM) 以在数据的结构化视图中随机访问 JSON 元素。
JSON(脚本对象表示法)是一种轻量级数据交换格式。它很容易被人类读取和写入,并由机器解析和生成。是 JSON 的官方互联网媒体类型。JSON 文件扩展名为 。application/json.json
在本文中,我们将使用 C# 标准库。还有一个流行的第三方库,称为 .Json.NET
System.Text.json命名空间提供高性能、低分配和符合标准的工具来使用 JSON。这些类允许我们将对象序列化为 JSON 文本,并将 JSON 文本反序列化为对象。UTF-8 支持是内置的。System.Text.Json
C# JSON 解析将流解析为 UTF-8 编码数据,表示单个 JSON 值到 .流被读取完成。JsonDocument.ParseJsonDocument
程序.cs
using System.Text.Json;
string data = @" [ {""name"": ""John Doe"" ""occupation"": ""gardener""}
{""name"": ""Peter Novak"" ""occupation"": ""driver""} ]";
using JsonDocument doc = JsonDocument.Parse(data);
JsonElement root = doc.RootElement;
Console.WriteLine(Root);
var u1 = root[0];
var u2 = root[1];
Console.WriteLine(u1);
Console.WriteLine(u2);
Console.WriteLine(u1.GetProperty("name"));
Console.WriteLine(u1.GetProperty("occupation"));
Console.WriteLine(u2.GetProperty("name"));
Console.WriteLine(u2.GetProperty("occupation"));
在此示例中,我们解析一个简单的 JSON 字符串。
using JsonDocument doc = JsonDocument.Parse(data);
我们将 JSON 字符串解析为 .JsonDocument
JsonElement root = doc.RootElement;
我们获取对具有属性的根元素的引用。RootElement
var u1 = root[0];
var u2 = root[1];
Console.WriteLine(u1);
Console.WriteLine(u2);
使用运算符,我们获取 JSON 文档的第一个和第二个子元素。[]
Console.WriteLine(u1.GetProperty("name"));
Console.WriteLine(u1.GetProperty("occupation"));
我们获取带有 的元素的属性。GetProperty
$ dotnet run
[ {"name": "John Doe" "occupation": "gardener"}
{"name": "Peter Novak" "occupation": "driver"} ]
{"name": "John Doe" "occupation": "gardener"}
{"name": "Peter Novak" "occupation": "driver"}
John Doe
gardener
Peter Novak
driver
C# JSON enumerate
枚举 JSON 数组中由 表示的值。JsonElement.EnumerateArrayJsonElement
程序.cs
using System.Text.Json;
string data = @" [ {""name"": ""John Doe"" ""occupation"": ""gardener""}
{""name"": ""Peter Novak"" ""occupation"": ""driver""} ]";
using var doc = JsonDocument.Parse(data);
JsonElement root = doc.RootElement;
var users = root.EnumerateArray();
while (users.MoveNext())
{
var user = users.Current;
System.Console.WriteLine(user);
var props = user.EnumerateObject();
while (props.MoveNext())
{
var prop = props.Current;
Console.WriteLine($"{prop.Name}: {prop.Value}");
}
}
在此示例中,我们枚举根元素的内容。
var users = root.EnumerateArray();
我们得到子元素的数组。
while (users.MoveNext())
{
var user = users.Current;
Console.WriteLine(user);
...
在 while 循环中,我们将遍历元素数组。
var props = user.EnumerateObject();
while (props.MoveNext())
{
var prop = props.Current;
Console.WriteLine($"{prop.Name}: {prop.Value}");
}
在第二个 while 循环中,我们将介绍每个元素的属性。
$ dotnet run
{"name": "John Doe" "occupation": "gardener"}
name: John Doe
occupation: gardener
{"name": "Peter Novak" "occupation": "driver"}
name: Peter Novak
occupation: driver
C# JSON 序列化
将指定类型的值转换为 JSON 字符串。JsonSerializer.Serialize
程序.cs
using System.Text.Json;
var user = new User("John Doe" "gardener" new MyDate(1995 11 30));
var json = JsonSerializer.Serialize(user);
Console.WriteLine(json);
record MyDate(int year int month int day);
record User(string Name string Occupation MyDate DateOfBirth);
在此示例中,我们将对象转换为 JSON 字符串。User
$ dotnet run
{"Name":"John Doe" "Occupation":"gardener"
"DateOfBirth":{"year":1995 "month":11 "day":30}}
C# JSON deserialize
将表示单个 JSON 值的文本解析为指定类型的实例。JsonSerializer.Deserialize
程序.cs
using System.Text.Json;
string json = @"{""Name"":""John Doe"" ""Occupation"":""gardener""
""DateOfBirth"":{""year"":1995 ""month"":11 ""day"":30}}";
var user = JsonSerializer.Deserialize<User>(json);
Console.WriteLine(user);
Console.WriteLine(user?.Name);
Console.WriteLine(user?.Occupation);
Console.WriteLine(user?.DateOfBirth);
record MyDate(int year int month int day);
record User(string Name string Occupation MyDate DateOfBirth);
该示例将 JSON 字符串解析为 该类型的实例。User
C# JsonSerializerOptions使用 ,我们可以使用某些选项控制序列化过程。JsonSerializerOptions
程序.cs
using System.Text.Json;
var words = new Dictionary<int string>
{
{1 "sky"}
{2 "cup"}
{3 "odd"}
{4 "cloud"}
{5 "forest"}
{6 "warm"}
};
var r = JsonSerializer.Serialize(words
new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(r);
Console.WriteLine("---------------------");
var d = JsonSerializer.Deserialize<Dictionary<int string>>(r);
foreach (var (k v) in d!)
{
Console.WriteLine($"{k}: {v}");
}
使用选项集,我们启用了缩进以进行漂亮的打印。WriteIndented
$ dotnet run
{
"1": "sky"
"2": "cup"
"3": "odd"
"4": "cloud"
"5": "forest"
"6": "warm"
}
---------------------
1: sky
2: cup
3: odd
4: cloud
5: forest
6: warm
C# Utf8JsonWriter
提供了一个高性能 API,用于对 UTF-8 编码的 JSON 文本进行只进、非缓存写入。Utf8JsonWriter
程序.cs
using System.Text.Json;
using System.Text;
using var ms = new MemoryStream();
using var writer = new Utf8JsonWriter(ms);
writer.WriteStartObject();
writer.WriteString("name" "John Doe");
writer.WriteString("occupation" "gardener");
writer.WriteNumber("age" 34);
writer.WriteEndObject();
writer.Flush();
string json = Encoding.UTF8.GetString(ms.ToArray());
Console.WriteLine(json);
在此示例中,我们创建一个新对象并将其写入 JSON 字符串。
$ dotnet run
{"name":"John Doe" "occupation":"gardener" "age":34}
我们可以设置选项来美化 JSON 输出。Indentedtrue
程序.cs
using System.Text.Json;
string data = @" [ {""name"": ""John Doe"" ""occupation"": ""gardener""}
{""name"": ""Peter Novak"" ""occupation"": ""driver""} ]";
JsonDocument jdoc = JsonDocument.Parse(data);
var fileName = @"data.json";
using FileStream fs = File.OpenWrite(fileName);
using var writer = new Utf8JsonWriter(fs new JsonWriterOptions { Indented = true });
jdoc.WriteTo(writer);
在此示例中,我们将 JSON 字符串写入文件。数据很漂亮。
$ cat data.json
[
{
"name": "John Doe"
"occupation": "gardener"
}
{
"name": "Peter Novak"
"occupation": "driver"
}
]
C# JSON Utf8JsonReader
该接口采用高性能 API,用于对 UTF-8 编码的 JSON 文本进行只进、只读访问。Utf8JsonReader
程序.cs
using System.Text.Json;
var fileName = @"/home/user7/data.json";
byte[] data = File.ReadAllBytes(fileName);
Utf8JsonReader reader = new Utf8JsonReader(data);
while (reader.Read())
{
switch (reader.TokenType)
{
case JsonTokenType.StartObject:
Console.WriteLine("-------------");
break;
case JsonTokenType.EndObject:
break;
case JsonTokenType.StartArray:
case JsonTokenType.EndArray:
break;
case JsonTokenType.PropertyName:
Console.Write($"{reader.GetString()}: ");
break;
case JsonTokenType.String:
Console.WriteLine(reader.GetString());
break;
default:
throw new ArgumentException();
}
}
在此示例中,我们从带有 .它提供了一个用于读取 JSON 数据的低级 API。我们逐个读取数据令牌。Utf8JsonReader
$ dotnet run
-------------
name: John Doe
occupation: gardener
-------------
name: Peter Novak
occupation: driver
C# JSON 解析异步
在下面的示例中,我们使用 异步读取流。JsonDocument.ParseAsync
程序.cs
using System.Text.Json;
using var httpClient = new HttpClient();
var url = "https://raw.Githubusercontent.com/dotnet/core/master/release-notes/releases-index.json";
var ts = await httpClient.GetStreamAsync(url);
using var resp = await JsonDocument.ParseAsync(ts);
var root = resp.RootElement.GetProperty("releases-index");
var elems = root.EnumerateArray();
while (elems.MoveNext())
{
var node = elems.Current;
Console.WriteLine(node);
}
该示例读取 .NET Core 框架的所有版本,这些版本在项目 Github 存储库中以 JSON 字符串的形式提供。
C# HttpClient GetFromJsonAsync该方法将 GET 请求发送到指定的 URL,并返回在异步操作中将响应正文反序列化为 JSON 所产生的值。GetFromJsonAsync
该方法是 来自 的扩展方法。System.Net.Http.Json
程序.cs
using System.Text.Json.Serialization;
using System.Net.Http.Json;
using var client = new HttpClient();
var url = "http://webcode.me/users.json";
var data = await client.GetFromJsonAsync<Users>(url);
if (data != null)
{
foreach (var user in data.users)
{
Console.WriteLine(user);
}
}
class Users
{
public List<User> users { get; set; } = new();
}
class User
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("first_name")]
public string FirstName { get; set; } = string.Empty;
[JsonPropertyName("last_name")]
public string LastName { get; set; } = string.Empty;
[JsonPropertyName("email")]
public string Email { get; set; } = string.Empty;
public override string ToString()
{
return $"User {{ {Id}| {FirstName} {LastName}| {Email} }}";
}
}
We create an asynchronous http request to a JSON resource. The JSON data is serialized into a list of objects. User
var data = await client.GetFromJsonAsync<Users>(url);
这是一种将 JSON 资源转换为 C# 集合的便捷方法。GetFromJsonAsync
class Users
{
public List<User> users { get; set; } = new();
}
我们需要为集合创建一个特定的类。List
class User
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("first_name")]
public string FirstName { get; set; } = string.Empty;
[JsonPropertyName("last_name")]
public string LastName { get; set; } = string.Empty;
[JsonPropertyName("email")]
public string Email { get; set; } = string.Empty;
public override string ToString()
{
return $"User {{ {Id}| {FirstName} {LastName}| {Email} }}";
}
}
JSON 字段映射到类属性。
$ dotnet run
User { 1| Robert Schwartz| rob23@gmail.com }
User { 2| Lucy Ballmer| lucyb56@gmail.com }
User { 3| Anna Smith| annasmith23@gmail.com }
User { 4| Robert Brown| bobbrown432@yahoo.com }
User { 5| Roger Bacon| rogerbacon12@yahoo.com }
在本文中,我们已使用 C# 处理 JSON 数据。