c#Nettonsoft.net库常用的方法json序列化反序列化
Newtonsoft.Json 是一个流行的 JSON 操作库,用于在 .NET 应用程序中序列化、反序列化和操作 JSON 数据。下面是 Newtonsoft.Json 常用的一些方法:
序列化对象为 JSON 字符串:
string json = JsonConvert.SerializeObject(obj);
var obj = new { Name = "John", Age = 30 }; string json = JsonConvert.SerializeObject(obj); // 输出结果:{"Name":"John","Age":30}
反序列化JSON字符串为对象:
T obj = JsonConvert.DeserializeObject<T>(json);
string json = "{\"Name\":\"John\",\"Age\":30}"; var obj = JsonConvert.DeserializeObject<Person>(json); // 其中 Person 类定义为:class Person { public string Name { get; set; } public int Age { get; set; } }
将JSON对象转换成键值对集合:
JObject jObject = JObject.Parse(json);
Dictionary<string, string> dictionary = jObject.ToObject<Dictionary<string, string>>();
var obj = new { Name = "John", Age = 30 }; string json = JsonConvert.SerializeObject(obj); // 输出结果:{"Name":"John","Age":30}
忽略对象中的null值属性:
string json = JsonConvert.SerializeObject(obj, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
var obj = new { Name = "John", Age = (string)null }; string json = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); // 输出结果:{"Name":"John"}
将JSON字符串转换成易读的形式:
string formattedJson = JValue.Parse(json).ToString(Formatting.Indented);
string json = "{\"Name\":\"John\",\"Age\":30}"; string formattedJson = JValue.Parse(json).ToString(Formatting.Indented); // 输出结果: // { // "Name": "John", // "Age": 30 // }
将json对象转换成动态对象:
string json = "{\"Name\":\"John\",\"Age\":30}"; dynamic obj = JsonConvert.DeserializeObject(json); Console.WriteLine(obj.Name); // 输出:John Console.WriteLine(obj.Age); // 输出:30
类中有的属性但是在JSON字符串中没有对应值需要注意的事
情况一:JSON 中包含 "Age" 值
class Person { public string Name { get; set; } public int Age { get; set; } // 不使用可空类型 } string json1 = "{\"Name\":\"John\",\"Age\":30}"; Person obj1 = JsonConvert.DeserializeObject<Person>(json1); Console.WriteLine(obj1.Name); // 输出:John Console.WriteLine(obj1.Age); // 输出:30
情况二:JSON 中没有 "Age" 值
class Person { public string Name { get; set; } public int Age { get; set; } // 不使用可空类型 } string json2 = "{\"Name\":\"John\"}"; Person obj2 = JsonConvert.DeserializeObject<Person>(json2); Console.WriteLine(obj2.Name); // 输出:John Console.WriteLine(obj2.Age); // 输出:0(默认值)
在情况一中,当 JSON 包含 "Age" 值时,可以直接将其赋值给对象的 Age 属性。
而在情况二中,由于 JSON 中没有 "Age" 值,反序列化后的对象会使用类型的默认值,对于 int 类型来说,默认值是 0。这可能会导致不合理的结果。
如果希望在情况二中避免不合理的默认值,可以使用可空类型来声明 Age 属性,并将其设置为 null。这样,即使 JSON 中没有 "Age" 值,反序列化后的对象的 Age 属性会是 null
情况三:JSON 中缺少 "Age" 键
class Person { public string Name { get; set; } public int? Age { get; set; } // 使用可空类型 } string json3 = "{\"Name\":\"John\"}"; Person obj3 = JsonConvert.DeserializeObject<Person>(json3); Console.WriteLine(obj3.Name); // 输出:John Console.WriteLine(obj3.Age); // 输出:null
在情况三中,由于 JSON 中缺少 "Age" 键,反序列化后的对象会使用可空类型的默认值 null,因此 Age 属性为 null。