Unity中Newtonsoft.Json的使用(二)

目录

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.IsoDateFormatISO格式
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中如何解决这样的问题。

Unity中Newtonsoft.Json的使用(三)

  • 51
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity2019是一款非常流行的游戏开发引擎,而Newtonsoft.Json.dll是一个非常常用的Json处理库。Newtonsoft.Json.dll可以帮助我们在Unity2019进行Json数据的序列化和反序列化操作。 在Unity2019使用Newtonsoft.Json.dll可以非常方便地将对象转换为Json格式的字符串,或者将Json格式的字符串转换为对象。这对于网络通信、存储数据或者配置文件的读写等场景非常有用。 使用Newtonsoft.Json.dll进行序列化时,我们可以使用一些属性来控制Json的生成方式,比如可以指定属性的命名规则、设置日期格式化方式、对空值进行处理等等。这些属性可以帮助我们更好地控制和优化Json数据的生成过程。 在反序列化方面,使用Newtonsoft.Json.dll可以帮助我们将Json格式的字符串快速地转换为对应的对象。我们可以使用一些特性来指定如何解析Json数据,比如可以使用JsonProperty来指定Json字段与对象属性之间的映射关系。 除了基本的序列化和反序列化功能之外,Newtonsoft.Json.dll还提供了一些高级功能,比如将对象序列化为Xml格式、处理动态类型、处理匿名类型等等。这些功能可以帮助我们更加灵活地处理Json数据。 总之,Unity2019使用Newtonsoft.Json.dll可以帮助我们方便地进行Json数据的处理,节省了我们自己编写Json解析代码的时间和精力,提高了开发效率。它是Unity开发不可或缺的重要工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值