本文是个人在工作中记录Json.NET使用笔记,简单的举例介绍了一下使用方法。
Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单,并且开源。本人主要用到了自定义Json序列化的功能。
下载地址: 官网地址 、GitHub
官方文档: 官方API.
简介:继承JsonConverter重写其方法可以自定义属性的序列化方式。
随便生成一个类
代码如下:
public class Student
{
public int Age;
public Sex Sex;
public string Name { get; set; }
}
public enum Sex
{
boy,
girl
}
尝试将该类进行Json序列化操作
代码如下:
//1.将对象序列化为Json字符串
Student mm = new Student() { Age = 3, Name = "MM", Sex = Sex.girl };
string jsonStr = JsonConvert.SerializeObject(mm);
Console.WriteLine(jsonStr);
查看运行结果:
可以看到枚举类型被换成了int类型,传给前端可能不易理解。
接下来我们再新建一个类,并且继承JsonConverter,重写其方法。
代码如下:
///
/// 自定义属性转换类
///
public class SexCustomSerializable : JsonConverter
{
//表示反序列化时是否执行该转换器
public override bool CanRead => true;
//表示序列化时是否执行该转换器
public override bool CanWrite => true;
//判断执行条件(可以判断类型是否符合再执行转换)
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Sex);
}
//反序列化时执行的转换方法
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
Sex sex = Sex.boy;
Enum.TryParse<Sex>(reader.Value.ToString(), out sex);
return sex;
}
/// 序列化时执行的转换
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
//string v = value.ToString();
writer.WriteValue(value.ToString());
}
}
转换器使用方法很简单,在对应的属性上加上标签即可
代码如下:
public class Student
{
public int Age;
[JsonConverter(typeof(SexCustomSerializable))]
public Sex Sex;
public string Name { get; set; }
}
查看运行结果:
可以看到枚举类型根据我们转换器重写的WriteJson方法toString输出了。
当然,如果只需要把枚举类型从int转换到String输出,Json.NET有封装好的转换器给我们用。
代码如下:
public class Student
{
public int Age;
[JsonConverter(typeof(StringEnumConverter))]
public Sex Sex;
public string Name { get; set; }
}
简介:使用[JsonIgnore]标签可以是实体类在序列化时忽略该属性,[JsonProperty]与之相反。
实体类是默认会在Json序列化时,转换全部的属性,如果有不需要的可以打上[JsonIgnore]标签,其实默认的实体类会有[JsonObject(MemberSerialization.OptOut)]标签,表示转换全部属性。
public class Student
{
[JsonIgnore]
public int Age;
[JsonConverter(typeof(StringEnumConverter))]
public Sex Sex;
public string Name { get; set; }
}
[JsonProperty]与[JsonIgnore]效果相反,在有[JsonObject(MemberSerialization.OptIn)]的实体类里面指定属性转换。
[JsonObject(MemberSerialization.OptIn)]
public class Student
{
[JsonProperty]
public int Age;
[JsonProperty]
[JsonConverter(typeof(StringEnumConverter))]
public Sex Sex;
public string Name { get; set; }
}
public class Student
{
//[JsonProperty]
public int Age;
//[JsonConverter(typeof(StringEnumConverter))]
public Sex Sex;
public string Name { get; set; }
[JsonProperty]
private DateTime born;
public void SetBron(DateTime date)
{
born = date;
}
public DateTime GetBron()
{
return born;
}
}
Student gg = new Student() { Age = 5, Sex = Sex.boy };
gg.SetBron(DateTime.Now.ToLocalTime());
Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings();
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
{
//空值处理
setting.NullValueHandling = NullValueHandling.Ignore;
//添加性别枚举转换器
setting.Converters.Add(new SexCustomSerializable());
//对时间的处理
setting.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
return setting;
});
一般情况实体类都不能随意修改,在序列化与反序列化时可以自定义序列化出字符串的属性名称。
代码:
public class Student
{
//[JsonProperty]
public int Age;
//[JsonConverter(typeof(StringEnumConverter))]
public Sex Sex;
public string Name { get; set; }
[JsonProperty(PropertyName = "BornDay")]
private DateTime born;
public void SetBron(DateTime date)
{
born = date;
}
public DateTime GetBron()
{
return born;
}
}
Student gg = new Student() { Age = 5, Sex = Sex.boy };
gg.SetBron(DateTime.Now.ToLocalTime());
Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings();
//JsonSerializerSettings setting = new JsonSerializerSettings();
//string jsonStr = JsonConvert.Serializeobject(p, Newtonsoft.Json.Formatting.Indented, setting);
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
{
//空值处理
setting.NullValueHandling = NullValueHandling.Ignore;
//添加性别枚举转换器
setting.Converters.Add(new SexCustomSerializable());
//对时间的处理
setting.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
return setting;
});
string ggStr = JsonConvert.SerializeObject(gg);
简介:继承DefaultContractResolver类重写其方法,可以实现动态决定属性序列化。
这里新建一个StudentPropsContractResolver类继承DefaultContractResolver,并且重写其方法。
代码:
public class StudentPropsContractResolver : DefaultContractResolver
{
///
/// 需要处理的属性名
///
private string[] props = null;
///
/// 属性是否需要序列化
/// (一般都是指定哪些属性不序列化的多,但这里加入该属性可以应对两种情况)
///
private bool serialize;
public StudentPropsContractResolver(string[] props, bool retain = true)
{
this.props = props;
this.serialize = retain;
}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
//原方法里面有注释,看不懂的也可以自己调试一下就明白参数都是啥了
//获取类的属性
IList<JsonProperty> list = base.CreateProperties(type, memberSerialization);
//只保留数组中的属性
return list.Where(p =>
{
if (serialize)
{
return props.Contains(p.PropertyName);
}
else
{
return !props.Contains(p.PropertyName);
}
}).ToList();
}
}
执行代码:
//1.将对象序列化为Json字符串
Student mm = new Student() { Age = 3, Name = "MM", Sex = Sex.girl };
string jsonStr = JsonConvert.SerializeObject(mm);
JsonSerializerSettings jsetting = new JsonSerializerSettings();
jsetting.ContractResolver = new StudentPropsContractResolver(new string[] { "Age", "Sex" });
Console.WriteLine(JsonConvert.SerializeObject(mm, jsetting));
jsetting.ContractResolver = new StudentPropsContractResolver(new string[] { "Name", "Sex" });
Console.WriteLine(JsonConvert.SerializeObject(mm, jsetting));
Console.ReadLine();
结果:
可以看到通过重写DefaultContractResolver方法可以实现动态决定属性序列化。
简介:有时候我们需要设置一下通用的规则,可以在JsonConvert.DefaultSettings不用再给每一个属性打标签了。
在这里想把null的属性不序列化了。
代码:
Student gg = new Student() { Age = 5, Sex = Sex.boy };
Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings();
string ggStr = JsonConvert.SerializeObject(gg);
Console.WriteLine(ggStr);
Console.ReadLine();
结果:
可以看到name没有赋值输出了null,可能会给前端带了一些困扰,而且值也没有什么意义,当然也可以直接设置jsetting.NullValueHandling = NullValueHandling.Ignore来让空值不序列化。
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public String Name { get; set; }
Json.Net提供了全局设置,方便我们操作。
代码:
Student gg = new Student() { Age = 5, Sex = Sex.boy };
Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings();
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
{
//空值处理
setting.NullValueHandling = NullValueHandling.Ignore;
return setting;
});
string ggStr = JsonConvert.SerializeObject(gg);
当然,默认设置不仅仅可以设置null不序列化,还可以把我们刚才创建的转换器添加到设置里。
代码:
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
{
//空值处理
setting.NullValueHandling = NullValueHandling.Ignore;
//添加性别枚举转换器
setting.Converters.Add(new SexCustomSerializable());
return setting;
});
实体类去除标签:
public class Student
{
//[JsonProperty]
public int Age;
//[JsonConverter(typeof(StringEnumConverter))]
public Sex Sex;
public string Name { get; set; }
}
结果:
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
{
//空值处理
setting.NullValueHandling = NullValueHandling.Ignore;
//添加性别枚举转换器
setting.Converters.Add(new SexCustomSerializable());
//对时间的处理
setting.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
return setting;
});
前面也有说到实体类一般不会去动他,这个也包括打标签等操作,在实际开发中,一个实体类越简单越好。所以以下使用方法比较规范一些。
代码:
public class Student
{
//[JsonProperty]
public int Age;
//[JsonConverter(typeof(StringEnumConverter))]
public Sex Sex;
public string Name { get; set; }
//[JsonProperty(PropertyName = "BornDay")]
private DateTime born;
public void SetBron(DateTime date)
{
born = date;
}
public DateTime GetBron()
{
return born;
}
}
Student gg = new Student() { Age = 5, Sex = Sex.boy };
gg.SetBron(DateTime.Now.ToLocalTime());
Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings();
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
{
//空值处理
setting.NullValueHandling = NullValueHandling.Ignore;
var contractResolver = new StudentPropsContractResolver(new string[] { "Age", "Sex", "bron" });
contractResolver.IgnoreSerializableAttribute = true;
setting.ContractResolver = contractResolver;
//添加性别枚举转换器
setting.Converters.Add(new SexCustomSerializable());
//对时间的处理
setting.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
return setting;
});
string ggStr = JsonConvert.SerializeObject(gg);
Newtonsoft.Json序列化库提供了很多Json序列化有关的特性方便我们开发,学会使用是不难的,上面列举的只是一部分功能,更多的功能可以到官网文档进行学习。