Unity中Newtonsoft.Json的使用(二)

这篇具有很好参考价值的文章主要介绍了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默认不序列化

jsonserializersettings.dateformathandling,Unity,unity,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 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;
    }

注释几个字段

jsonserializersettings.dateformathandling,Unity,unity,json

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

jsonserializersettings.dateformathandling,Unity,unity,json

1.2 空值设置

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

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

设置一下NullValueHandling

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

将引用类型注释掉

jsonserializersettings.dateformathandling,Unity,unity,json

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

jsonserializersettings.dateformathandling,Unity,unity,json

1.3 日期格式设置

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

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

设置一下DateFormatHandling

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

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

jsonserializersettings.dateformathandling,Unity,unity,json

2.JsonProperty的使用

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

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

2.1非公共字段序列化

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

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

jsonserializersettings.dateformathandling,Unity,unity,json

可以看到之前一直没被序列化的phone字段成功序列化了出来jsonserializersettings.dateformathandling,Unity,unity,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;       //下班时间
}

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

jsonserializersettings.dateformathandling,Unity,unity,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;       //下班时间
}

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

jsonserializersettings.dateformathandling,Unity,unity,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已经被忽略了

jsonserializersettings.dateformathandling,Unity,unity,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也被忽略了

jsonserializersettings.dateformathandling,Unity,unity,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 

jsonserializersettings.dateformathandling,Unity,unity,json

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

jsonserializersettings.dateformathandling,Unity,unity,json

2.6 自定义字段名称

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

jsonserializersettings.dateformathandling,Unity,unity,json

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

jsonserializersettings.dateformathandling,Unity,unity,json

2.7 枚举使用String类型序列化

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

jsonserializersettings.dateformathandling,Unity,unity,json

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

jsonserializersettings.dateformathandling,Unity,unity,json

简单小结

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

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

Unity中Newtonsoft.Json的使用(三)文章来源地址https://www.toymoban.com/news/detail-849467.html

到了这里,关于Unity中Newtonsoft.Json的使用(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 怎么在unity3D工程中导入Newtonsoft.Json

    打开 Unity 编辑器。 转到菜单栏的 “Window”(窗口)选项,然后选择 “Package Manager”(包管理器) 在搜索框中输入 “Newtonsoft Json” 进行搜索。 注意:要选择Unity Registry 在搜索结果中,会看到 “Newtonsoft Json” 类似名称的项目。 单击搜索结果下方的 “Install”(安装)按钮。

    2024年02月02日
    浏览(59)
  • 使用Newtonsoft直接读取Json格式文本(Linq to Json)

    使用 Newtonsoft.Json(通常简称为 Newtonsoft)可以轻松地处理 JSON 格式的文本。Newtonsoft.Json 是 .NET 中一个流行的 JSON 处理库,它提供了丰富的功能和灵活性。 以下是使用 Newtonsoft.Json 进行 Linq to JSON 的示例代码: 首先,你需要在项目中安装 Newtonsoft.Json 包。你可以通过 NuGet 包管理

    2024年02月16日
    浏览(59)
  • CYQ.Data 操作 Json 性能测试:对比 Newtonsoft.Json

    在 CYQ.Data 版本更新的这么多年,中间过程的版本都在完善各种功能。 基于需要支持或兼容的代码越多,很多时候,常规思维,都把相关功能完成,就结束了。 实现过程中,无法避免的会用到大量的反射、锁等对性能有所影响的逻辑代码。 CYQ.Data 从V5.9 版本开始,开始大规

    2024年03月18日
    浏览(54)
  • C# Newtonsoft.Json解析json到自定义实体类

    使用Newtonsoft.Json解析json到自定义实体类也很方便,关键点在于实体类定义属性的时候加上JsonProperty标签。最简单的一种形式可以形如这样: JsonProperty后面括弧里的字串即代表json中对应的属性名称。通过这种方式即可关联json属性和实体类属性。 调用的时候也很简单, 这样就

    2024年02月20日
    浏览(47)
  • Newtonsoft.Json/Json.NET忽略序列化时的意外错误

    在.NET中Newtonsoft.Json(Json.NET)是我们常用来进行Json序列化与反序列化的库。 而在使用中常会遇到反序列化Json时,遇到不规则的Json数据解构而抛出异常。 Newtonsoft.Json 支持序列化和反序列化过程中的错误处理。 允许您捕获错误并选择是处理它并继续序列化,还是让错误冒泡并抛

    2024年03月21日
    浏览(50)
  • Unity使用Gradle打包方式接入Firebase时配置文件google-services.json遇到的坑

    1、首先在mainTemplate.gradle最上引入 ‘’com.google.gms.google-services’ 如下图: 2、在mainTemplate.gradle添加任务,将下载下来的google-services.json复制到gradle项目根目录下 如下图: 将你原始文件 google-services.json 中的 package_name 的属性值 改为 com.unity3d.player 如下图:

    2024年02月11日
    浏览(48)
  • Unity解析json文件(分为json与jsonArray)

    什么是json? JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度, 那么,JSON到底是什么? JSON就是一串字符串 只不过元素会使用特定的符号标注。 {} 双括号表示对象 [] 中括号表示数组 “” 双引号内是

    2024年02月08日
    浏览(42)
  • Unity——JSON的读取

    在实际中,读取JSON比保存JSON重要得多。因为存档、发送数据包往往可以采用其他序列化方法,但游戏的配置文件使用JSON格式比较常见。游戏的配置数据不属于动态数据,属于游戏资源,但很适合用JSON表示。 下面以一个简单的JSON数据文件为例,演示读取JSON。从整体上看有两

    2024年02月06日
    浏览(41)
  • Unity之Json读取写入

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,主要用于传送数据。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使

    2024年02月05日
    浏览(57)
  • 【Unity数据交互】JSON开山篇

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity基础实战 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有易于读写和解析的特点,广泛应用于各种应用程序中的数据

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包