c# JsonConvert 简单实验

本文介绍了一个使用C#进行JSON序列化和反序列化的简单例子。通过定义一个包含不同数据类型的类,并利用Newtonsoft.Json库实现对象到JSON字符串的转换及反向操作。展示了如何创建类实例、序列化为JSON字符串并打印,然后从该字符串反序列化回原始对象。

代码 

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            //序列号
            string str = JsonConvert.SerializeObject(a);
            Console.WriteLine(str);
            //反序列化
            A a2 = JsonConvert.DeserializeObject<A>(str);
            a2.display();
            Console.ReadKey();
            //JsonConvert.
        }
    }
    class A {
        public A() {
            a = 0;
            b = "b";
        }
        public int a;
        public string b;
        public long C { set; get; }
        public void display() {
            Console.WriteLine("a" + a);
            Console.WriteLine("b" + b);
            Console.WriteLine("C" + C);
        }
    }
}

代码

 

<think>我们正在讨论C#JsonConvert.DeserializeObject方法的使用。根据引用[2]和引用[3],我们可以知道这个方法用于将JSON字符串反序列化为C#对象。有两种主要方式:反序列化为强类型对象和反序列化为动态类型(dynamic)对象。 引用[2]展示了如何将JSON字符串转换为具体类型的对象(强类型): ```csharp string json = @"{ 'Name': 'John Doe', 'Age': 30 }"; var person = JsonConvert.DeserializeObject<Person>(json); ``` 这里需要预先定义一个Person类,其属性与JSON中的键对应。 引用[3]则展示了如何将JSON字符串转换为dynamic类型对象,这样无需预先定义类结构: ```csharp dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }"); string name = stuff.Name; string address = stuff.Address.City; ``` 引用[4]提到了一个常见问题:当JSON中的时间字段是Unix时间戳,而我们需要在C#中转换成DateTime类型时,可以通过自定义JsonConverter来实现。 此外,我们还需要注意,JsonConvert.DeserializeObject方法是Newtonsoft.Json(也称为Json.NET)库中的方法。在.NET Core 3.0及更高版本中,微软提供了自己的JSON库System.Text.Json,但本问题中我们讨论的是Newtonsoft.Json。 现在,我们来总结使用方法和示例,并讨论可能遇到的问题及解决方案。 ### 1. 反序列化为强类型对象 **步骤:** 1. 定义与JSON结构匹配的C#类。 2. 使用`JsonConvert.DeserializeObject<T>(jsonString)`方法。 **示例:** 假设有JSON字符串: ```json { "Name": "Alice", "Age": 25, "Email": "alice@example.com" } ``` 定义类: ```csharp public class Person { public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } } ``` 反序列化: ```csharp string json = @"{ 'Name': 'Alice', 'Age': 25, 'Email': 'alice@example.com' }"; Person person = JsonConvert.DeserializeObject<Person>(json); ``` ### 2. 反序列化为动态类型(dynamic) **步骤:** 1. 使用`JsonConvert.DeserializeObject(jsonString)`(不指定类型)或`JsonConvert.DeserializeObject<dynamic>(jsonString)`。 2. 通过动态属性访问数据。 **示例:** ```csharp string json = @"{ 'Name': 'Bob', 'Age': 30, 'IsActive': true }"; dynamic person = JsonConvert.DeserializeObject(json); Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, Active: {person.IsActive}"); ``` ### 3. 处理复杂嵌套结构 对于嵌套的JSON对象,可以定义嵌套类或使用dynamic。 **示例(嵌套类):** JSON: ```json { "Name": "Charlie", "Address": { "Street": "123 Main St", "City": "Seattle" } } ``` 定义类: ```csharp public class Address { public string Street { get; set; } public string City { get; set; } } public class Person { public string Name { get; set; } public Address Address { get; set; } } ``` 反序列化同上。 ### 4. 常见问题及解决方案 #### 问题1:JSON键与C#属性名不一致 **解决方案:** 使用`[JsonProperty]`特性指定映射。 ```csharp public class Person { [JsonProperty("full_name")] public string Name { get; set; } } ``` #### 问题2:处理日期时间格式(Unix时间戳转换为DateTime) **解决方案:** 自定义JsonConverter。 引用[4]中提到的情况,我们可以创建一个转换器: ```csharp public class UnixDateTimeConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(DateTime); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { long timestamp = (long)reader.Value; return DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // 序列化时同理,这里省略 throw new NotImplementedException(); } } ``` 然后在类中使用: ```csharp public class Event { [JsonConverter(typeof(UnixDateTimeConverter))] public DateTime EventTime { get; set; } } ``` #### 问题3:JSON中有额外字段,而C#类中没有对应的属性 默认情况下,Json.NET会忽略JSON中在目标类没有对应属性的额外字段。但如果需要捕获这些字段,可以使用`[JsonExtensionData]`特性。 ```csharp public class Person { public string Name { get; set; } [JsonExtensionData] public IDictionary<string, JToken> AdditionalData { get; set; } } ``` #### 问题4:反序列化时处理空值 如果JSON中某个字段可以为null,而C#属性是值类型(如int),则可能抛出异常。可以使用`Nullable<T>`(如`int?`)或者设置`NullValueHandling`选项。 ```csharp var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; var person = JsonConvert.DeserializeObject<Person>(json, settings); ``` ### 注意事项 - 确保引用了Newtonsoft.Json库(通过NuGet安装)。 - 对于大型JSON数据,考虑使用流式反序列化(`JsonTextReader`)以降低内存占用。 - 动态类型(dynamic)虽然灵活,但失去了类型安全和编译器检查,且性能可能略低于强类型。 以上就是JsonConvert.DeserializeObject的基本使用方法和常见问题处理。希望这些示例和解决方案能帮助你更好地使用JSON反序列化功能。 §§相关问题§§ 1. 如何在C#中处理JSON序列化? 2. Newtonsoft.Json和System.Text.Json有什么区别? 3. 如何将C#对象转换为JSON字符串? 4. 如何处理JSON反序列化时的类型转换错误? </think>### C#中`JsonConvert.DeserializeObject`的使用指南 `JsonConvert.DeserializeObject`是Newtonsoft.Json库的核心方法,用于将JSON字符串反序列化为C#对象。以下是详细说明和示例: --- #### 1. **基本用法** - **强类型反序列化**(需预定义类结构) 引用[2]示例: ```csharp // 定义类 public class Person { public string Name { get; set; } public int Age { get; set; } } // JSON反序列化 string json = @"{ 'Name': 'John Doe', 'Age': 30 }"; Person person = JsonConvert.DeserializeObject<Person>(json); Console.WriteLine(person.Name); // 输出: John Doe ``` - **动态类型反序列化**(无需预定义类) 引用[3]示例: ```csharp dynamic data = JsonConvert.DeserializeObject( @"{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York' } }" ); Console.WriteLine(data.Address.City); // 输出: New York ``` --- #### 2. **处理复杂场景** - **嵌套对象反序列化** ```csharp public class Address { public string City { get; set; } public string State { get; set; } } public class User { public string Name { get; set; } public Address Address { get; set; } // 嵌套对象 } string json = @"{ 'Name': 'Alice', 'Address': { 'City': 'Seattle', 'State': 'WA' } }"; User user = JsonConvert.DeserializeObject<User>(json); ``` - **集合反序列化** ```csharp string json = @"['Apple', 'Banana', 'Cherry']"; List<string> fruits = JsonConvert.DeserializeObject<List<string>>(json); ``` --- #### 3. **常见问题与解决方案** - **问题1: 字段名称不匹配** **解决方案**:使用`[JsonProperty]`特性 ```csharp public class Product { [JsonProperty("product_name")] // 映射JSON中的"product_name"字段 public string Name { get; set; } } ``` - **问题2: 时间戳转DateTime** 引用[4]中提到的时间戳转换方案: ```csharp public class UnixDateTimeConverter : JsonConverter { public override object ReadJson(JsonReader reader, Type type, object value, JsonSerializer serializer) { long timestamp = (long)reader.Value; return DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime; } // 需实现其他抽象方法... } public class Event { [JsonConverter(typeof(UnixDateTimeConverter))] public DateTime EventTime { get; set; } } ``` - **问题3: 处理空值或缺失字段** ```csharp var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, // 忽略JSON中的null MissingMemberHandling = MissingMemberHandling.Ignore // 忽略JSON多余字段 }; var obj = JsonConvert.DeserializeObject<MyClass>(json, settings); ``` --- #### 4. **高级技巧** - **自定义反序列化逻辑** 继承`JsonConverter`并重写方法,实现复杂转换逻辑。 - **性能优化** 对频繁调用的场景,缓存`JsonSerializerSettings`或预编译序列化器(需使用`JsonConvert.DefaultSettings`)。 --- #### 注意事项 - **引用库**:通过NuGet安装`Newtonsoft.Json`。 - **错误处理**:使用`try-catch`捕获`JsonSerializationException`。 - **安全性**:避免反序列化不可信来源的JSON(防范注入攻击)。 > 引用说明: > - 动态类型用法 [^3] > - 时间戳转换方案 [^4] > - 基础反序列化示例 [^2] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值