跳转到内容

C Sharp JSON 处理

来自代码酷

C# JSON处理[编辑 | 编辑源代码]

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。在C#中,处理JSON数据是常见的任务,特别是在Web API、配置文件和数据存储等场景中。本文将详细介绍如何在C#中处理JSON数据,包括序列化、反序列化以及使用流行库(如Newtonsoft.Json和System.Text.Json)的方法。

介绍[编辑 | 编辑源代码]

JSON是一种基于文本的格式,使用键值对表示数据。它通常用于客户端和服务器之间的数据传输,或存储配置信息。C#提供了多种方式来处理JSON数据,包括内置的`System.Text.Json`库和第三方库`Newtonsoft.Json`(也称为Json.NET)。

JSON示例:

{
    "name": "John Doe",
    "age": 30,
    "isStudent": false,
    "courses": ["Math", "Science", "History"]
}

在C#中,JSON数据可以映射到对象或集合,反之亦然。这种转换称为序列化(将对象转为JSON)和反序列化(将JSON转为对象)。

使用System.Text.Json[编辑 | 编辑源代码]

`System.Text.Json`是.NET Core 3.0及更高版本中内置的JSON处理库,性能较高且无需安装额外依赖。

反序列化JSON[编辑 | 编辑源代码]

将JSON字符串转换为C#对象:

using System;
using System.Text.Json;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public bool IsStudent { get; set; }
    public string[] Courses { get; set; }
}

string json = @"{
    ""name"": ""John Doe"",
    ""age"": 30,
    ""isStudent"": false,
    ""courses"": [""Math"", ""Science"", ""History""]
}";

Person person = JsonSerializer.Deserialize<Person>(json);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");

输出:

Name: John Doe, Age: 30

序列化为JSON[编辑 | 编辑源代码]

将C#对象转换为JSON字符串:

Person person = new Person
{
    Name = "Jane Smith",
    Age = 25,
    IsStudent = true,
    Courses = new[] { "Art", "Music" }
};

string json = JsonSerializer.Serialize(person);
Console.WriteLine(json);

输出:

{"Name":"Jane Smith","Age":25,"IsStudent":true,"Courses":["Art","Music"]}

自定义序列化选项[编辑 | 编辑源代码]

可以通过`JsonSerializerOptions`自定义序列化行为,例如格式化输出或忽略空值:

var options = new JsonSerializerOptions
{
    WriteIndented = true,
    IgnoreNullValues = true
};

string json = JsonSerializer.Serialize(person, options);
Console.WriteLine(json);

输出:

{
  "Name": "Jane Smith",
  "Age": 25,
  "IsStudent": true,
  "Courses": ["Art", "Music"]
}

使用Newtonsoft.Json[编辑 | 编辑源代码]

`Newtonsoft.Json`是一个流行的第三方库,功能丰富且兼容性广。

安装[编辑 | 编辑源代码]

通过NuGet安装:

Install-Package Newtonsoft.Json

反序列化JSON[编辑 | 编辑源代码]

using Newtonsoft.Json;

string json = @"{
    'name': 'John Doe',
    'age': 30,
    'isStudent': false,
    'courses': ['Math', 'Science', 'History']
}";

Person person = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");

序列化为JSON[编辑 | 编辑源代码]

Person person = new Person
{
    Name = "Jane Smith",
    Age = 25,
    IsStudent = true,
    Courses = new[] { "Art", "Music" }
};

string json = JsonConvert.SerializeObject(person, Formatting.Indented);
Console.WriteLine(json);

输出:

{
  "Name": "Jane Smith",
  "Age": 25,
  "IsStudent": true,
  "Courses": ["Art", "Music"]
}

高级特性[编辑 | 编辑源代码]

Newtonsoft.Json支持更多高级特性,如自定义转换器、动态对象处理和条件序列化:

var settings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore,
    Formatting = Formatting.Indented
};

string json = JsonConvert.SerializeObject(person, settings);

实际应用案例[编辑 | 编辑源代码]

从API读取JSON数据[编辑 | 编辑源代码]

以下示例展示如何从Web API获取JSON数据并反序列化为对象:

using System.Net.Http;
using System.Threading.Tasks;

public async Task<Person> GetPersonAsync(string url)
{
    using (HttpClient client = new HttpClient())
    {
        string json = await client.GetStringAsync(url);
        return JsonSerializer.Deserialize<Person>(json);
    }
}

配置文件处理[编辑 | 编辑源代码]

JSON常用于存储应用程序配置:

public class AppConfig
{
    public string LogPath { get; set; }
    public int MaxRetries { get; set; }
}

string configJson = File.ReadAllText("config.json");
AppConfig config = JsonSerializer.Deserialize<AppConfig>(configJson);

性能比较[编辑 | 编辑源代码]

`System.Text.Json`通常比`Newtonsoft.Json`更快且内存效率更高,但后者功能更丰富。以下是一个简单的性能对比:

barChart title 序列化性能比较(毫秒) x-axis Library y-axis Time series "1000次序列化" System.Text.Json: 120 Newtonsoft.Json: 180

总结[编辑 | 编辑源代码]

JSON处理是C#开发中的核心技能之一。本文介绍了两种主要方法: 1. **System.Text.Json**:高性能,内置支持,适合新项目。 2. **Newtonsoft.Json**:功能丰富,兼容性强,适合需要高级特性的场景。

根据项目需求选择合适的库,并合理使用序列化和反序列化技术。