目录
1.JsonSerializerSettings的使用
1.1 默认值设置
1.2 空值设置
1.3 日期格式设置
2.JsonProperty的使用
2.1非公共字段序列化
2.2指定序列化字段
2.2.1 方式一 OptIn
2.2.2 方式二 OptOut
2.3 默认值设置
2.4 空值设置
2.5 日期格式设置
2.6 自定义字段名称
2.7 枚举使用String类型序列化
简单小结
上一期(Unity中Newtonsoft.Json的使用(一))已经教会了大家怎么在Unity中使用Newtonsoft.Json进行数据化和反序列化。
这期将继续教大家在序列化时候进行一些设置,得到你想要的序列化结果。
首先建好测试的数据结构,方便我们进行后续测试使用。
建一个员工类Staff.cs
/// <summary>
/// 员工
/// </summary>
public class Staff
{
public int id; //工号
private string phone; //手机号
public string name; //名字
public StaffType type; //类型
public DateTime time; //下班时间
}
/// <summary>
/// 员工类型
/// </summary>
public enum StaffType
{
None = 0,
Chef = 10, //厨师
Waiter = 11, //店长
Manager = 12, //经理
}
再建个测试类
public class JsonTest2 : MonoBehaviour
{
void Start()
{
Staff staff = new Staff()
{
id = 5,
name = "小美",
type = StaffType.Waiter,
time = DateTime.Now,
};
Debug.Log(JsonMgr.Serialize(staff));
}
}
测试一下,没什么问题,私有类型Phone默认不序列化
1.JsonSerializerSettings的使用
JsonSerializerSettings,翻译过来就是“Json序列化设置”,看名字就知道是用来帮我们在序列化时进行一些设置的,我们可以在序列化时对JsonConvert进行一些设置,达到我们想要的序列化结果。
需要注意的是JsonSerializerSettings是全局的,对整个JsonConvert生效,对单个属性的设置可以看第2条JsonProperty的使用。
我们对上期写好的Json工具类进行改造一下,加入JsonSerializerSettings
using Newtonsoft.Json; //记得引用命名空间
public class JsonMgr
{
public static JsonSerializerSettings settings;
static JsonMgr()
{
settings = new JsonSerializerSettings();
settings.DefaultValueHandling = DefaultValueHandling.Ignore;
}
public static string Serialize<T>(T t)
{
return JsonConvert.SerializeObject(t,settings);
}
public static T DeSerialize <T>(string json)
{
return JsonConvert.DeserializeObject<T>(json, settings);
}
}
以下介绍几种JsonSerializerSettings中常见的用法
1.1 默认值设置
可以使用JsonSerializerSettings.DefaultValueHandling在序列化时进行默认值的设置,主要针对值类型进行设置,这是一个枚举类型,包含四个值
DefaultValueHandling | 默认值设置 |
---|---|
DefaultValueHandling.Include | 序列化和反序列化时,包含默认值 |
DefaultValueHandling.Ignore | 序列化和反序列化时,忽略默认值 |
DefaultValueHandling.Populate | 反序列化时,Json中不包含该字段,该字段有默认值的,将被填充默认值 |
DefaultValueHandling.IgnoreAndPopulate | 序列化时,忽略默认值,反序列化时,填充默认值 |
设置一下DefaultValueHandling
static JsonMgr()
{
settings = new JsonSerializerSettings();
settings.DefaultValueHandling = DefaultValueHandling.Ignore;
}
注释几个字段
看一下结果,可以看到type和time没有被序列化进去
1.2 空值设置
跟上面类似,对引用类型也有JsonSerializerSettings.NullValueHandling对可以为Null的字段进行设置,同样也是枚举类型
NullValueHandling | 值类型 |
---|---|
NullValueHandling.Include | 序列化和反序列化时,包含空字段 |
NullValueHandling.Ignore | 序列化和反序列化时,忽略空字段 |
设置一下NullValueHandling
static JsonMgr()
{
settings = new JsonSerializerSettings();
settings.NullValueHandling = NullValueHandling.Ignore;
}
将引用类型注释掉
可以看到为空的string类型的name的被忽略了
1.3 日期格式设置
我们可以使用JsonSerializerSettings.DateFormatHandling对Datetime类型的数据进行格式设置
DateFormatHandling | 日期格式设置 |
---|---|
DateFormatHandling.IsoDateFormat | ISO格式 |
DateFormatHandling.MicrosoftDateFormat | 时间戳格式 |
设置一下DateFormatHandling
static JsonMgr()
{
settings = new JsonSerializerSettings();
settings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
}
可以看到现在Datetime的格式已经变成时间戳的格式了
2.JsonProperty的使用
使用JsonProperty,翻译过来是“Json属性”,可以对标记的结构体、类、成员字段等进行标记,在序列化时使用不同的策略。
JsonProperty可以对单独的字段进行设置,达成和JsonSerializerSettings相同的效果,但只对JsonProperty标记的类型生效。
2.1非公共字段序列化
我们知道,在序列化时,会默认忽略非公共字段,那么怎么样才能在序列化时将非公共字段也序列化进去呢,这时候就可以使用JsonProperty进行标记。
我们对之前Staff类的私有字段phone进行标记
可以看到之前一直没被序列化的phone字段成功序列化了出来
2.2指定序列化字段
默认序列化公共字段,忽略非公共字段,那有什么版本能让我们自己指定要不要序列化某些字段呢。
和吃饭拿菜单点菜类似,我们可以在菜单上打勾指定我们想吃的菜,也可以划掉不想点的菜,剩下的就是我们想要吃的。Newtonsoft.Json也为我们提供了这样的方式
2.2.1 方式一 OptIn
OptIn就是将整个数据结构标记为了默认不要,使用JsonProperty标记的字段才进行序列化
对Staff类使用OptIn进行标记
[JsonObject(MemberSerialization.OptIn)]
public class Staff
{
[JsonProperty]
public int id; //工号
[JsonProperty]
private string phone; //手机号
public string name; //名字
public StaffType type; //类型
public DateTime time; //下班时间
}
看一下输出,只序列化了我们指定的字段
2.2.2 方式二 OptOut
OptOut就是将整个数据结构标记成了默认要,使用JsonIgnore标记的字段忽略序列化
对Staff类使用OptOut进行标记
[JsonObject(MemberSerialization.OptOut)]
public class Staff
{
[JsonIgnore]
public int id; //工号
[JsonIgnore]
private string phone; //手机号
public string name; //名字
public StaffType type; //类型
public DateTime time; //下班时间
}
再看一下输出,可以看到把我们不要的字段忽略了
2.3 默认值设置
在JsonProperty中也支持我们对默认值进行设置
public class Staff
{
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public int id; //工号
private string phone; //手机号
public string name; //名字
public StaffType type; //类型
public DateTime time; //下班时间
}
将id设置为默认值0,看一下输出,id已经被忽略了
2.4 空值设置
空值设置也是一样的方式
public class Staff
{
public int id; //工号
private string phone; //手机号
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string name; //名字
public StaffType type; //类型
public DateTime time; //下班时间
}
注释掉name,看一下输出,name也被忽略了
2.5 日期格式设置
日期格式的设置则有不同,可不是像下面这样的
[JsonProperty(DateFormatHandling = DateFormatHandling.MicrosoftDateFormat)]
Newtonsoft.Json为我们提供了IsoDateTimeConverter这个类用来转换日期,通过JsonConverter进行使用
public class Staff
{
public int id; //工号
private string phone; //手机号
public string name; //名字
public StaffType type; //类型
[JsonConverter(typeof(IsoDateTimeConverter))]
public DateTime time; //下班时间
}
当然,我们也可以自己重写DateTimeConverterBase来自定义
using Newtonsoft.Json.Converters;
public class MyDateTimeConvert : IsoDateTimeConverter
{
public MyDateTimeConvert() : base()
{
base.DateTimeFormat = "yyyy年MM月dd日 HH时mm分";
}
}
在JsonConvter中使用我们自己定义的MyDateTimeConvert
看一下输出,已经变成了我们自定义的格式
2.6 自定义字段名称
有时候我们想要指定序列化时字段的名称,让我们在阅读时更加方便,或者减少占用空间,但又不想改变原来的字段名,就可以使用自定义字段名的方式
可以看到id序列化时候的字段名已经变成了我们自定义的工号了
2.7 枚举使用String类型序列化
我们知道Unity的Enum枚举类型末日使用Value值而不是string名字进行存储,如果我们一开始没指定好每个枚举成员的值,一旦我们在前面或中间插入一个新的枚举,原来的枚举数据就会发生偏移,这不是我们想要的结果。那么有什么方式,能让我们一开始就使用string名字进行序列化呢,Newtonsoft.Json也为我们提供了这样一个转换器StringEnumConverter,同样通过JsonConverter进行使用
可以看到我们的枚举类型type已经成功地使用string名字进行序列化了
简单小结
本期教了大家在Newtonsoft.Json中对序列化和反序列化进行了一些常用的设置,还有一些比较不常用的没有介绍到,比如使用JsonSerializerSettings.ContractResolver来指定序列化时字段名的格式,大家可以自行研究。
很多同学在使用Json时都会遇到以下这个问题:数据结构包含继承关系时,反序列时使用基类类型,子类专属字段会发生丢失。下一节,我将教大家在Newtonsoft.json中如何解决这样的问题。文章来源:https://www.toymoban.com/news/detail-849467.html
Unity中Newtonsoft.Json的使用(三)文章来源地址https://www.toymoban.com/news/detail-849467.html
到了这里,关于Unity中Newtonsoft.Json的使用(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!