开放的编程资料库

当前位置:我爱分享网 > C#教程 > 正文

C# 牛顿软件 Json.NET

C#Json.NET教程展示了如何使用NewtonsoftJson.NET库处理JSON数据。

JSON

JSON(JavaScript对象表示法)是一种轻量级数据交换格式。它很容易被人类阅读和编写,并被机器解析和生成。application/json是JSON的官方互联网媒体类型。JSON文件扩展名为.json

NewtonsoftJson.NET是一种流行的.NET高性能JSON框架。

在本文中,我们使用NewtonsoftJson.NET库。在标准库中,我们可以选择使用System.Text.Json

JsonConvert提供了在.NET类型和JSON类型之间进行转换的方法。JsonConvert.SerializeObject将指定对象序列化为JSON字符串。JsonConvert.DeserializeObject将JSON反序列化为.NET对象。

Json.NET序列化对象

在下面的示例中,我们将对象序列化为JSON字符串。

using Newtonsoft.Json;

var p = new Product("Product A", new DateTime(2021, 12, 28),
    new string[] { "small" });

var json = JsonConvert.SerializeObject(p);
Console.WriteLine(json);

record Product(string Name, DateTime Created, string[] Sizes);

产品记录被转换为JSON字符串。

$ dotnet run
{"Name":"Product A","Created":"2021-12-28T00:00:00","Sizes":["small"]}

Json.NET反序列化成对象

下一个示例将生成的JSON字符串序列化回.NET类型。

using Newtonsoft.Json;

var json = @"{""Name"":""Product A"",""Created"":""2021-12-28T00:00:00"",""Sizes"":[""small""]}";

Product? p = JsonConvert.DeserializeObject<Product>(json);
Console.WriteLine(p);

record Product(string Name, DateTime Created, string[] Sizes);

我们将JSON字符串转换回记录类型。

Product? p = JsonConvert.DeserializeObject<Product>(json);

在尖括号内,我们指定请求的.NET类型。

$ dotnet run
Product { Name = Product A, Created = 12/28/2021 12:00:00 AM, Sizes = System.String[] }

Json.NET序列化列表

在下一个例子中,我们序列化一个列表。

using Newtonsoft.Json;

var words = new List<string> { "war", "water", "cup",
    "forest", "falcon", "snow", "chair", "book" };

string data = JsonConvert.SerializeObject(words);
Console.WriteLine(data);

var users = new List<User> {
    new User("John Doe", "gardener"),
    new User("Roger Roe", "driver"),
    new User("Lucia Novak", "teacher")
};

string data2 = JsonConvert.SerializeObject(users);
Console.WriteLine(data2);

record User(string Name, string Occupation);

该程序使用JsonConvert.SerializeObject将字符串列表和用户对象转换为JSON字符串。

$ dotnet run
["war","water","cup","forest","falcon","snow","chair","book"]
[{"Name":"John Doe","Occupation":"gardener"},{"Name":"Roger Roe","Occupation":"driver"},
    {"Name":"Lucia Novak","Occupation":"teacher"}]

Json.NET反序列化列表

下一个示例反序列化列表。

using Newtonsoft.Json;

string json1 = @"[""war"",""water"",""cup"",""forest"",""falcon"",""snow"",""chair"",""book""]";
string json2 = @"[{""Name"":""John Doe"",""Occupation"":""gardener""},{""Name"":""Roger Roe"",""Occupation"":""driver""},
    {""Name"":""Lucia Novak"",""Occupation"":""teacher""}]";

List<string>? words = JsonConvert.DeserializeObject<List<string>>(json1);

if (words != null)
{
    Console.WriteLine(string.Join(',', words));
}

List<User>? users = JsonConvert.DeserializeObject<List<User>>(json2);

if (users != null)
{
    Console.WriteLine(string.Join(',', users));
}

record User(string Name, string Occupation);

程序将两个JSON字符串转换回字符串列表和用户对象列表。

$ dotnet run
war,water,cup,forest,falcon,snow,chair,book
User { Name = John Doe, Occupation = gardener },User { Name = Roger Roe, Occupation = driver },User { Name = Lucia Novak, Occupation = teacher }

Json.NET漂亮的打印

以下示例美化了JSON输出。

using Newtonsoft.Json;

var settings = new JsonSerializerSettings
{
    Formatting = Newtonsoft.Json.Formatting.Indented
};

var users = new List<User> {
    new User("John Doe", "gardener"),
    new User("Roger Roe", "driver"),
    new User("Lucia Novak", "teacher")
};

string data = JsonConvert.SerializeObject(users, settings);
Console.WriteLine(data);

record User(string Name, string Occupation);

我们使用JsonSerializerSettings来修改JSON输出。

var settings = new JsonSerializerSettings
{
    Formatting = Newtonsoft.Json.Formatting.Indented
};

我们设置Newtonsoft.Json.Formatting.Indented以获得更好的输出。

$ dotnet run
[
    {
    "Name": "John Doe",
    "Occupation": "gardener"
    },
    {
    "Name": "Roger Roe",
    "Occupation": "driver"
    },
    {
    "Name": "Lucia Novak",
    "Occupation": "teacher"
    }
]

Json.NET从网络读取JSON数据

接下来我们使用HttpClient创建一个GET请求并处理JSON输出。

using Newtonsoft.Json;

using var client = new HttpClient();

var url = "http://webcode.me/users.json";

var res = await client.GetAsync(url);
var json = await res.Content.ReadAsStringAsync();

Users? data = JsonConvert.DeserializeObject<Users>(json);

if (data != null)
{
    foreach (var user in data.users)
    {
        Console.WriteLine(user);
    }
}

class Users
{
    public List<User> users { get; set; } = new();
}

class User
{
    [JsonPropertyAttribute("id")]
    public int Id { get; set; }

    [JsonPropertyAttribute("first_name")]
    public string FirstName { get; set; } = string.Empty;

    [JsonPropertyAttribute("last_name")]
    public string LastName { get; set; } = string.Empty;

    [JsonPropertyAttribute("email")]
    public string Email { get; set; } = string.Empty;

    public override string ToString()
    {
        return $"User {{ {Id}| {FirstName} {LastName}| {Email} }}";
    }
}

我们从网络资源中读取一个JSON字符串并将其转换为一个对象列表。

var res = await client.GetAsync(url);

我们创建一个GET请求到指定的资源。

var json = await res.Content.ReadAsStringAsync();

从响应内容中,我们得到JSON字符串。

Users? data = JsonConvert.DeserializeObject<Users>(json);

我们将JSON字符串反序列化为用户列表。

[JsonPropertyAttribute("first_name")]
public string FirstName { get; set; } = string.Empty;

JsonPropertyAttribute指示JsonSerializer始终序列化具有指定名称的成员。

$ 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 }

在本文中,我们使用NewtonsoftJson.NET在C#中处理JSON数据。

列出所有C#教程。

未经允许不得转载:我爱分享网 » C# 牛顿软件 Json.NET

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏