下面我将详细讲解 "C#使用Json.Net进行序列化和反序列化及定制化" 的完整攻略。
什么是Json.Net
Json.Net 是一个用于Json数据格式的处理工具库,非常流行,由于 JsonSerializer已经成为.NET Framework的一部分,因此在使用Json相关操作时我们非常推荐使用Json.Net
如何进行Json序列化
使用 Json.Net 进行 Json 序列化,只需要调用 JsonSerializer.Serialize() 方法即可,示例代码如下:
using Newtonsoft.Json;
public class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
Product p = new Product();
p.Name = "Apple";
p.Price = 10;
string json = JsonConvert.SerializeObject(p);
Console.WriteLine(json);
输出结果为:{"Name":"Apple","Price":10}
如何进行Json反序列化
使用 Json.Net 进行 Json 反序列化,只需要调用 JsonSerializer.Deserialize() 方法即可,示例代码如下:
using Newtonsoft.Json;
string json = @"{
'Name': 'Apple',
'Price': 10
}";
Product p = JsonConvert.DeserializeObject<Product>(json);
Console.WriteLine(p.Name);
Console.WriteLine(p.Price);
输出结果为:
Apple
10
如何进行Json定制化
Json.Net提供了多种定制化选项,可以让我们实现各种不同的功能需求,下面列出一些常见的定制化选项:
更改属性名称
如果需要把 Person 对象转换成 Json 格式的字符串,但需要输出的是 firstName 和 lastName 而不是 FirstName 和 LastName。 在 Person 类中加上 JsonPropertyAttribute 属性即可实现属性名称转换。 例如:
public class Person
{
[JsonProperty("first_name")]
public string FirstName { get; set; }
[JsonProperty("last_name")]
public string LastName { get; set; }
}
Person person = new Person
{
FirstName = "John",
LastName = "Doe",
};
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json);
输出结果为:{"first_name":"John","last_name":"Doe"}
忽略属性
如果你有一个对象,其中某个属性不应该被序列化,你可以使用 JsonIgnoreAttribute 属性来忽略该属性。 例如:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
[JsonIgnore]
public string Password { get; set; }
}
Person person = new Person
{
FirstName = "John",
LastName = "Doe",
Password = "Passw0rd"
};
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json);
输出结果为:{"FirstName":"John","LastName":"Doe"}
自定义序列化
如果需要更加精细地控制序列化,可以通过实现 JsonConverter 来自定义序列化。 可以通过重写 ReadJson() 和 WriteJson() 方法来实现自定义序列化。 下面是一个简单的示例:
public class DictionaryConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(IDictionary) || objectType == typeof(IDictionary<,>);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartObject();
foreach (DictionaryEntry entry in (IDictionary)value)
{
writer.WritePropertyName(entry.Key.ToString());
serializer.Serialize(writer, entry.Value);
}
writer.WriteEndObject();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Dictionary<string, object> dict = new Dictionary<string, object> { { "key1", "value1" }, { "key2", 2 } };
string json = JsonConvert.SerializeObject(dict, new DictionaryConverter());
Console.WriteLine(json);
输出结果为:{"key1":"value1","key2":2}
忽略默认值
如果一个属性的值是默认值,希望Json.Net在序列化对象时不对它进行序列化,可以通过设置DefaultValueHandling属性来实现。例如:
public class Person
{
[DefaultValue("")]
public string FirstName { get; set; }
[DefaultValue(0)]
public int Age { get; set; }
}
Person person = new Person
{
FirstName = "John",
Age = 0,
};
string json = JsonConvert.SerializeObject(person, new JsonSerializerSettings
{
DefaultValueHandling = DefaultValueHandling.Ignore
});
Console.WriteLine(json);
输出结果为:{"FirstName":"John"}
至此,我们已经完成了"C#使用Json.Net进行序列化和反序列化及定制化" 的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用Json.Net进行序列化和反序列化及定制化 - Python技术站