快捷搜索:  汽车  科技

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""} {""

net中使用json(.NET自带的高性能)(1)

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 数据。

猜您喜欢: