C# Json.NET实现JSON转换示例

作者:技术拾光

时间:2026-05-25

浏览:369

JSON是C#开发中重要的数据交换格式,Newtonsoft.Json库是实现高效处理的关键工具。它支持序列化与反序列化,能简化C#对象与JSON间的转换,并允许通过自定义设置优化流程。该库还提供高级功能如自定义转换器,并支持BSON格式以提升性能。合理运用可增强数据处理效率,降低系统耦合度。

文章目录

在C#开发领域,JSON已成为数据交换的核心格式。作为Web服务与API交互的通用语言,这种轻量级数据格式是现代开发者必须掌握的技能。在C#中处理JSON时,Newtonsoft.Json(即Json.NET)库凭借其强大功能与灵活性,成为开发者的首选工具。本文将深入探讨如何运用这个工具高效处理JSON数据。

C# Json.NET实现JSON转换示例

JSON在C#中的应用价值

JSON在数据交换中的作用

JSON以其轻量级和易读性优势,在C#项目中广泛应用。无论是Web API的请求响应、配置文件读写还是应用状态序列化,JSON都发挥着关键作用。它作为标准化桥梁,实现了不同平台和语言间的数据互通,对构建跨平台应用具有重要意义。

JSON与C#数据类型的互操作性

C#作为面向对象语言,其数据模型与JSON格式具有天然兼容性。通过序列化可将C#对象转换为JSON字符串,反序列化则能将JSON字符串还原为C#对象。这种双向转换能力极大简化了前后端数据交互流程,使数据存储和操作更加直观高效。

JSON在系统架构中的重要性

在C#应用架构中,JSON不仅是数据格式,更是数据传输的标准载体。它是前后端分离架构实现的关键环节,合理运用JSON能提升数据处理效率,降低系统模块耦合度,为构建可扩展的高性能软件系统奠定基础。

Json.NET库的核心功能与应用

Json.NET的安装与配置

通过NuGet安装Json.NET

在Visual Studio中,可通过NuGet包管理器安装Json.NET。打开“工具”菜单,选择“NuGet包管理器”,点击“管理解决方案的NuGet包”。在浏览标签页搜索“Newtonsoft.Json”并安装。也可使用包管理器控制台执行命令:

Install-Package Newtonsoft.Json

基础配置方法

安装后需在代码文件中引入命名空间:

using Newtonsoft.Json;

复杂项目可通过JsonSerializerSettings类进行全局配置。例如在配置文件中定义设置:


    
var settings = JsonConvert.DeserializeObject(
    ConfigurationManager.AppSettings["JsonNETSettings"]);
JsonConvert.DefaultSettings = () => settings;

核心功能详解

序列化与反序列化

Json.NET的核心功能是实现对象与JSON字符串的相互转换。序列化示例如下:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Person person = new Person { Name = "John", Age = 30 };
string json = JsonConvert.SerializeObject(person);

反序列化示例如下:

Person deserializedPerson = JsonConvert.DeserializeObject(json);

高级功能应用

Json.NET支持自定义转换器处理特殊类型:

public class DateTimeConverter : DateTimeConverterBase
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 自定义读取逻辑
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // 自定义写入逻辑
    }
}

该库还支持JSON路径查询、泛型集合和动态类型处理,满足复杂场景需求。

实际项目应用案例

在Web API开发中,Json.NET常用于返回JSON格式响应:

[HttpGet]
public ActionResult GetUserDetails(int userId)
{
    var user = GetUserFromDatabase(userId);
    return Json(user, JsonRequestBehavior.AllowGet);
}

SerializeObject与DeserializeObject方法深度解析

SerializeObject方法详解

基础使用方法

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

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime DateOfBirth { get; set; }
}

Person person = new Person
{
    Name = "John Doe",
    Age = 30,
    DateOfBirth = new DateTime(1990, 01, 01)
};

string json = JsonConvert.SerializeObject(person);

高级配置技巧

通过配置选项可实现更精细的控制。例如忽略循环引用:

var settings = new JsonSerializerSettings
{
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
string jsonWithLoop = JsonConvert.SerializeObject(someObjectWithLoop, settings);

自定义日期格式:

settings.DateFormatString = "yyyy-MM-dd";
string jsonWithCustomDateFormat = JsonConvert.SerializeObject(person, settings);

DeserializeObject方法详解

基础使用方法

DeserializeObject方法将JSON字符串还原为对象:

string json = @"{""Name"":""John Doe"",""Age"":30,""DateOfBirth"":""1990-01-01T00:00:00""}";
Person deserializedPerson = JsonConvert.DeserializeObject(json);

高级应用技巧

支持自定义转换器:

Person deserializedPerson = JsonConvert.DeserializeObject(json, new CustomJsonConverter());

通过特殊契约解析器处理无公共setter的属性:

var settings = new JsonSerializerSettings
{
    ContractResolver = new PrivateSetterContractResolver()
};
Person deserializedPerson = JsonConvert.DeserializeObject(json, settings);

综合应用实践

复杂数据结构处理

处理嵌套对象或数组结构:

public class Company
{
    public string Name { get; set; }
    public List Employees { get; set; }
}

Company company = new Company
{
    Name = "My Company",
    Employees = new List
    {
        new Person { Name = "Alice", Age = 25 },
        new Person { Name = "Bob", Age = 32 }
    }
};
string json = JsonConvert.SerializeObject(company, Formatting.Indented);

异常处理与性能优化

异常处理必不可少:

try
{
    Person deserializedPerson = JsonConvert.DeserializeObject(json);
}
catch (JsonException ex)
{
    Console.WriteLine($"JSON解析错误: {ex.Message}");
}

性能优化建议:减少不必要属性转换、复用JsonSerializer实例、精简自定义转换器逻辑、谨慎使用全局设置。

BSON格式数据处理

BSON格式特性

BSON定义与优势

BSON(Binary JSON)是JSON的二进制表示形式,保留了JSON的文档结构。其主要优势在于更高的处理效率和更紧凑的存储空间,特别适合网络传输和高频读写场景。

BSON与JSON对比

  • 存储格式:BSON为二进制格式,JSON为文本格式
  • 处理性能:BSON解析速度更快
  • 数据体积:BSON通常更小
  • 兼容性:JSON兼容性更广泛

Json.NET中的BSON支持

BSON处理方法

Json.NET通过BsonDataWriter和BsonDataReader处理BSON数据:

using Newtonsoft.Json;
using Newtonsoft.Json.Bson;
using System.IO;

public static void ConvertJsonToBSON(string jsonString, string bsonFilePath)
{
    using (var stream = new MemoryStream())
    {
        using (var writer = new BsonDataWriter(stream))
        {
            var serializer = new JsonSerializer();
            var json = JToken.Parse(jsonString);
            serializer.Serialize(writer, json);
        }
        File.WriteAllBytes(bsonFilePath, stream.ToArray());
    }
}

实际应用示例

var complexObject = new ComplexClass() { /* ... */ };
var bsonBytes = JsonConvert.SerializeObject(complexObject, ...).ToByteArray();
File.WriteAllBytes("complexObject.bson", bsonBytes);

byte[] bsonData = File.ReadAllBytes("complexObject.bson");
var deserializedObject = BsonExtensionMethods.ByteArrayToBsonDocument(bsonData).ToJObject();

自定义序列化行为

基础自定义方法

属性忽略设置

使用[JsonIgnore]特性可排除特定属性:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    [JsonIgnore]
    public string SecretInfo { get; set; }
}

日期格式自定义

通过JsonConverter实现日期格式定制:

public class CustomDateTimeConverter : JsonConverter
{
    public override bool CanConvert(Type objectType) => objectType == typeof(DateTime);

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var value = reader.Value as string;
        return string.IsNullOrEmpty(value)  DateTime.MinValue : DateTime.ParseExact(value, "yyyy-MM-dd", null);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var date = (DateTime)value;
        writer.WriteValue(date.ToString("yyyy-MM-dd"));
    }
}

高级自定义策略

复杂对象序列化策略

通过继承JsonConverter并重写WriteJson和ReadJson方法,可实现完全自定义的序列化逻辑。

性能影响分析

自定义序列化会增加处理开销,需在灵活性与性能间取得平衡。应关注转换器逻辑复杂度、数据量大小和调用频率等因素。

JSON与C#数据类型映射

基础类型对应关系

基本类型映射

JSON字符串对应C#的string类型,数字对应int/double等数值类型,布尔值对应bool类型,数组对应List或数组类型,对象对应自定义类,null对应null值。

类型转换处理

反序列化时需确保类型匹配。可通过JsonSerializerSettings定义转换规则:

var json = @"{""age"": 30, ""name"": ""John"", ""active"": true}";
var person = JsonConvert.DeserializeObject(json);

复杂类型对应关系

对象与类映射

JSON对象通常对应C#类实例。使用[JsonProperty]特性可显式指定映射关系:

public class User
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("username")]
    public string Username { get; set; }
}

数组与集合映射

JSON数组对应C#集合类型。处理多态数组时可使用接口建模:

public interface IAnimal { string Type { get; } }
public class Dog : IAnimal { public string Type => "Dog"; public string Name { get; set; } }
public class Zoo { public List Animals { get; set; } }

动态数据处理

JObject与JArray基础操作

处理结构不确定的JSON数据时,可使用JObject和JArray:

var json = @"{ ""name"": ""John"", ""age"": 30, ""cars"": [""Ford"", ""BMW""] }";
var obj = JObject.Parse(json);
Console.WriteLine(obj["name"]);
Console.WriteLine(((JArray)obj["cars"])[0]);

动态类型处理

使用dynamic关键字简化访问:

dynamic data = JObject.Parse(@"{ ""name"": ""John"", ""age"": 30 }");
Console.WriteLine(data.name);
Console.WriteLine(data.age);

掌握这些数据类型映射关系和工具,能够帮助开发者在C#中高效处理各种JSON数据结构。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章