C# Newtonsoft.Json库的常用属性和方法详解

 更新时间:2025年03月14日 09:03:04   作者:老胖闲聊  
Newtonsoft.Json(也称为Json.NET)是一个非常流行的用于处理JSON数据的库,它提供了丰富的属性和方法,用于序列化和反序列化JSON数据,下面将通过C#代码详细讲解一些常用的属性和方法,并提供详细的代码注释,需要的朋友可以参考下

1. 安装Newtonsoft.Json

首先,需要通过NuGet安装Newtonsoft.Json库。可以通过以下命令安装:

Install-Package Newtonsoft.Json

2. 基本序列化和反序列化

序列化(将对象转换为JSON字符串)

using Newtonsoft.Json;
using System;

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

class Program
{
    static void Main()
    {
        // 创建一个Person对象
        Person person = new Person { Name = "John", Age = 30 };

        // 使用JsonConvert.SerializeObject方法将对象序列化为JSON字符串
        string json = JsonConvert.SerializeObject(person);

        // 输出JSON字符串
        Console.WriteLine(json);
        // 输出: {"Name":"John","Age":30}
    }
}

反序列化(将JSON字符串转换为对象)

using Newtonsoft.Json;
using System;

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

class Program
{
    static void Main()
    {
        // JSON字符串
        string json = "{\"Name\":\"John\",\"Age\":30}";

        // 使用JsonConvert.DeserializeObject方法将JSON字符串反序列化为Person对象
        Person person = JsonConvert.DeserializeObject<Person>(json);

        // 输出对象的属性
        Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
        // 输出: Name: John, Age: 30
    }
}

3. 格式化JSON输出

可以使用Formatting.Indented来格式化JSON输出,使其更易读。

using Newtonsoft.Json;
using System;

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

class Program
{
    static void Main()
    {
        // 创建一个Person对象
        Person person = new Person { Name = "John", Age = 30 };

        // 使用JsonConvert.SerializeObject方法将对象序列化为JSON字符串,并格式化输出
        string json = JsonConvert.SerializeObject(person, Formatting.Indented);

        // 输出格式化后的JSON字符串
        Console.WriteLine(json);
        // 输出:
        // {
        //   "Name": "John",
        //   "Age": 30
        // }
    }
}

4. 处理JSON属性名称

可以使用[JsonProperty]属性来指定JSON属性名称与C#属性名称不同。

using Newtonsoft.Json;
using System;

public class Person
{
    [JsonProperty("full_name")]
    public string Name { get; set; }

    [JsonProperty("years_old")]
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        // 创建一个Person对象
        Person person = new Person { Name = "John", Age = 30 };

        // 序列化对象
        string json = JsonConvert.SerializeObject(person);

        // 输出JSON字符串
        Console.WriteLine(json);
        // 输出: {"full_name":"John","years_old":30}

        // 反序列化JSON字符串
        Person deserializedPerson = JsonConvert.DeserializeObject<Person>(json);

        // 输出对象的属性
        Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
        // 输出: Name: John, Age: 30
    }
}

5. 忽略属性

可以使用[JsonIgnore]属性来忽略某个属性,使其不参与序列化和反序列化。

using Newtonsoft.Json;
using System;

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

    [JsonIgnore]
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        // 创建一个Person对象
        Person person = new Person { Name = "John", Age = 30 };

        // 序列化对象
        string json = JsonConvert.SerializeObject(person);

        // 输出JSON字符串
        Console.WriteLine(json);
        // 输出: {"Name":"John"}

        // 反序列化JSON字符串
        Person deserializedPerson = JsonConvert.DeserializeObject<Person>(json);

        // 输出对象的属性
        Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
        // 输出: Name: John, Age: 0 (Age被忽略,默认值为0)
    }
}

6. 处理空值

可以使用NullValueHandling来控制序列化时如何处理空值。

using Newtonsoft.Json;
using System;

public class Person
{
    public string Name { get; set; }
    public int? Age { get; set; } // 使用可空类型
}

class Program
{
    static void Main()
    {
        // 创建一个Person对象,Age为null
        Person person = new Person { Name = "John", Age = null };

        // 序列化对象,忽略空值
        var settings = new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Ignore
        };
        string json = JsonConvert.SerializeObject(person, settings);

        // 输出JSON字符串
        Console.WriteLine(json);
        // 输出: {"Name":"John"}

        // 反序列化JSON字符串
        Person deserializedPerson = JsonConvert.DeserializeObject<Person>(json);

        // 输出对象的属性
        Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
        // 输出: Name: John, Age: (Age为null)
    }
}

7. 自定义序列化和反序列化

可以通过实现JsonConverter来自定义序列化和反序列化逻辑。

using Newtonsoft.Json;
using System;

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

public class PersonConverter : JsonConverter<Person>
{
    public override void WriteJson(JsonWriter writer, Person value, JsonSerializer serializer)
    {
        writer.WriteStartObject();
        writer.WritePropertyName("full_name");
        writer.WriteValue(value.Name);
        writer.WritePropertyName("years_old");
        writer.WriteValue(value.Age);
        writer.WriteEndObject();
    }

    public override Person ReadJson(JsonReader reader, Type objectType, Person existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var jsonObject = JObject.Load(reader);
        return new Person
        {
            Name = (string)jsonObject["full_name"],
            Age = (int)jsonObject["years_old"]
        };
    }
}

class Program
{
    static void Main()
    {
        // 创建一个Person对象
        Person person = new Person { Name = "John", Age = 30 };

        // 使用自定义的PersonConverter进行序列化
        string json = JsonConvert.SerializeObject(person, new PersonConverter());

        // 输出JSON字符串
        Console.WriteLine(json);
        // 输出: {"full_name":"John","years_old":30}

        // 使用自定义的PersonConverter进行反序列化
        Person deserializedPerson = JsonConvert.DeserializeObject<Person>(json, new PersonConverter());

        // 输出对象的属性
        Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
        // 输出: Name: John, Age: 30
    }
}

8. 处理日期格式

可以使用DateFormatString来指定日期的序列化格式。

using Newtonsoft.Json;
using System;

public class Event
{
    public string Name { get; set; }
    public DateTime Date { get; set; }
}

class Program
{
    static void Main()
    {
        // 创建一个Event对象
        Event event = new Event { Name = "Conference", Date = new DateTime(2023, 10, 15) };

        // 使用DateFormatString指定日期格式
        var settings = new JsonSerializerSettings
        {
            DateFormatString = "yyyy-MM-dd"
        };
        string json = JsonConvert.SerializeObject(event, settings);

        // 输出JSON字符串
        Console.WriteLine(json);
        // 输出: {"Name":"Conference","Date":"2023-10-15"}

        // 反序列化JSON字符串
        Event deserializedEvent = JsonConvert.DeserializeObject<Event>(json, settings);

        // 输出对象的属性
        Console.WriteLine($"Name: {deserializedEvent.Name}, Date: {deserializedEvent.Date}");
        // 输出: Name: Conference, Date: 10/15/2023 12:00:00 AM
    }
}

9. 处理循环引用

当对象之间存在循环引用时,可以使用ReferenceLoopHandling来处理。

using Newtonsoft.Json;
using System;

public class Employee
{
    public string Name { get; set; }
    public Employee Manager { get; set; }
}

class Program
{
    static void Main()
    {
        // 创建两个Employee对象,并形成循环引用
        Employee employee1 = new Employee { Name = "John" };
        Employee employee2 = new Employee { Name = "Jane", Manager = employee1 };
        employee1.Manager = employee2;

        // 使用ReferenceLoopHandling.Ignore来处理循环引用
        var settings = new JsonSerializerSettings
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
        };
        string json = JsonConvert.SerializeObject(employee1, settings);

        // 输出JSON字符串
        Console.WriteLine(json);
        // 输出: {"Name":"John","Manager":{"Name":"Jane"}}
    }
}

10. 使用LINQ to JSON

Newtonsoft.Json还提供了LINQ to JSON功能,允许使用LINQ查询JSON数据。

using Newtonsoft.Json.Linq;
using System;

class Program
{
    static void Main()
    {
        // JSON字符串
        string json = "{\"Name\":\"John\",\"Age\":30,\"Address\":{\"City\":\"New York\",\"State\":\"NY\"}}";

        // 解析JSON字符串为JObject
        JObject person = JObject.Parse(json);

        // 使用LINQ查询JSON数据
        string name = (string)person["Name"];
        int age = (int)person["Age"];
        string city = (string)person["Address"]["City"];

        // 输出查询结果
        Console.WriteLine($"Name: {name}, Age: {age}, City: {city}");
        // 输出: Name: John, Age: 30, City: New York
    }
}

总结

Newtonsoft.Json是一个非常强大且灵活的JSON处理库,提供了丰富的属性和方法来处理JSON数据。通过上述代码示例和详细注释,应该能够掌握如何使用Newtonsoft.Json进行序列化、反序列化、格式化、处理属性名称、忽略属性、处理空值、自定义序列化、处理日期格式、处理循环引用以及使用LINQ to JSON等功能。

以上就是C# Newtonsoft.Json库的常用属性和方法的详细内容,更多关于C# Newtonsoft.Json库使用的资料请关注脚本之家其它相关文章!

相关文章

  • Unity3D实现模型淡入淡出效果

    Unity3D实现模型淡入淡出效果

    这篇文章主要为大家详细介绍了Unity3D实现模型淡出效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C#用ComboBox控件实现省与市的联动效果的方法

    C#用ComboBox控件实现省与市的联动效果的方法

    这篇文章主要介绍了C#用ComboBox控件实现省与市的联动效果的方法,较为详细的分析了ComboBox控件的使用原理与相关技巧,需要的朋友可以参考下
    2015-01-01
  • C#中正则表达式的3种匹配模式

    C#中正则表达式的3种匹配模式

    本文主要介绍在C#中正则匹配的三种模式:单行模式(Singleline)、多行模式(Multiline)与忽略大小写(IgnoreCase),希望能帮到大家。
    2016-05-05
  • C#字符串内存驻留机制分析

    C#字符串内存驻留机制分析

    这篇文章介绍了C#字符串内存驻留机制,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • 对int array进行排序的实例讲解

    对int array进行排序的实例讲解

    下面小编就为大家分享一篇对int array进行排序的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • c#使用csredis操作redis的示例

    c#使用csredis操作redis的示例

    这篇文章主要介绍了c#使用csredis操作redis的示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • 解析C#中用Process类终止进程,执行命令的深入分析

    解析C#中用Process类终止进程,执行命令的深入分析

    本篇文章是对C#中用Process类终止进程,执行命令进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 使用MSScriptControl 在 C# 中读取json数据的方法

    使用MSScriptControl 在 C# 中读取json数据的方法

    下面小编就为大家带来一篇使用MSScriptControl 在 C# 中读取json数据的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 关于C#数强转会不会抛出异常详解

    关于C#数强转会不会抛出异常详解

    这篇文章主要给大家介绍了关于C#数强转会不会抛出异常的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • 使用NOPI读取Word、Excel文档内容

    使用NOPI读取Word、Excel文档内容

    这篇文章主要为大家详细介绍了使用NOPI读取Word、Excel文档内容的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论