Unity中Newtonsoft.Json的使用(二)

2024-06-13 1446阅读

目录

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

/// 
/// 员工
/// 
public class Staff
{
    public int id;              //工号
    private string phone;       //手机号
    public string name;         //名字
    public StaffType type;      //类型
    public DateTime time;       //下班时间
}
/// 
/// 员工类型
/// 
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默认不序列化

Unity中Newtonsoft.Json的使用(二)

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)
    {
        return JsonConvert.SerializeObject(t,settings);
    }
    public static T DeSerialize (string json)
    {
        return JsonConvert.DeserializeObject(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;
    }

注释几个字段

Unity中Newtonsoft.Json的使用(二)

看一下结果,可以看到type和time没有被序列化进去

Unity中Newtonsoft.Json的使用(二)

1.2 空值设置

跟上面类似,对引用类型也有JsonSerializerSettings.NullValueHandling对可以为Null的字段进行设置,同样也是枚举类型

NullValueHandling值类型
NullValueHandling.Include序列化和反序列化时,包含空字段
NullValueHandling.Ignore序列化和反序列化时,忽略空字段

设置一下NullValueHandling

static JsonMgr()
    {
        settings = new JsonSerializerSettings();
        settings.NullValueHandling = NullValueHandling.Ignore;
    }

将引用类型注释掉

Unity中Newtonsoft.Json的使用(二)

可以看到为空的string类型的name的被忽略了

Unity中Newtonsoft.Json的使用(二)

1.3 日期格式设置

我们可以使用JsonSerializerSettings.DateFormatHandling对Datetime类型的数据进行格式设置

DateFormatHandling日期格式设置
DateFormatHandling.IsoDateFormatISO格式
DateFormatHandling.MicrosoftDateFormat时间戳格式

设置一下DateFormatHandling

static JsonMgr()
    {
        settings = new JsonSerializerSettings();
        settings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
    }

可以看到现在Datetime的格式已经变成时间戳的格式了

Unity中Newtonsoft.Json的使用(二)

2.JsonProperty的使用

使用JsonProperty,翻译过来是“Json属性”,可以对标记的结构体、类、成员字段等进行标记,在序列化时使用不同的策略。

JsonProperty可以对单独的字段进行设置,达成和JsonSerializerSettings相同的效果,但只对JsonProperty标记的类型生效。

2.1非公共字段序列化

我们知道,在序列化时,会默认忽略非公共字段,那么怎么样才能在序列化时将非公共字段也序列化进去呢,这时候就可以使用JsonProperty进行标记。

我们对之前Staff类的私有字段phone进行标记

Unity中Newtonsoft.Json的使用(二)

可以看到之前一直没被序列化的phone字段成功序列化了出来Unity中Newtonsoft.Json的使用(二)

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;       //下班时间
}

看一下输出,只序列化了我们指定的字段

Unity中Newtonsoft.Json的使用(二)

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;       //下班时间
}

再看一下输出,可以看到把我们不要的字段忽略了

Unity中Newtonsoft.Json的使用(二)

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已经被忽略了

Unity中Newtonsoft.Json的使用(二)

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也被忽略了

Unity中Newtonsoft.Json的使用(二)

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 

Unity中Newtonsoft.Json的使用(二)

看一下输出,已经变成了我们自定义的格式

Unity中Newtonsoft.Json的使用(二)

2.6 自定义字段名称

有时候我们想要指定序列化时字段的名称,让我们在阅读时更加方便,或者减少占用空间,但又不想改变原来的字段名,就可以使用自定义字段名的方式

Unity中Newtonsoft.Json的使用(二)

可以看到id序列化时候的字段名已经变成了我们自定义的工号了

Unity中Newtonsoft.Json的使用(二)

2.7 枚举使用String类型序列化

我们知道Unity的Enum枚举类型末日使用Value值而不是string名字进行存储,如果我们一开始没指定好每个枚举成员的值,一旦我们在前面或中间插入一个新的枚举,原来的枚举数据就会发生偏移,这不是我们想要的结果。那么有什么方式,能让我们一开始就使用string名字进行序列化呢,Newtonsoft.Json也为我们提供了这样一个转换器StringEnumConverter,同样通过JsonConverter进行使用

Unity中Newtonsoft.Json的使用(二)

可以看到我们的枚举类型type已经成功地使用string名字进行序列化了

Unity中Newtonsoft.Json的使用(二)

简单小结

本期教了大家在Newtonsoft.Json中对序列化和反序列化进行了一些常用的设置,还有一些比较不常用的没有介绍到,比如使用JsonSerializerSettings.ContractResolver来指定序列化时字段名的格式,大家可以自行研究。

很多同学在使用Json时都会遇到以下这个问题:数据结构包含继承关系时,反序列时使用基类类型,子类专属字段会发生丢失。下一节,我将教大家在Newtonsoft.json中如何解决这样的问题。

Unity中Newtonsoft.Json的使用(三)

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]