国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity中Newtonsoft.Json的使用(二)

這篇具有很好參考價值的文章主要介紹了Unity中Newtonsoft.Json的使用(二)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

1.JsonSerializerSettings的使用

1.1 默認(rèn)值設(shè)置

1.2 空值設(shè)置

1.3 日期格式設(shè)置

2.JsonProperty的使用

2.1非公共字段序列化

2.2指定序列化字段

2.2.1 方式一 OptIn

2.2.2 方式二 OptOut

2.3 默認(rèn)值設(shè)置

2.4 空值設(shè)置

2.5 日期格式設(shè)置

2.6 自定義字段名稱

2.7 枚舉使用String類型序列化

簡單小結(jié)


上一期(Unity中Newtonsoft.Json的使用(一))已經(jīng)教會了大家怎么在Unity中使用Newtonsoft.Json進行數(shù)據(jù)化和反序列化。

這期將繼續(xù)教大家在序列化時候進行一些設(shè)置,得到你想要的序列化結(jié)果。

首先建好測試的數(shù)據(jù)結(jié)構(gòu),方便我們進行后續(xù)測試使用。

建一個員工類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,   //經(jīng)理
}

再建個測試類

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默認(rèn)不序列化

jsonserializersettings.dateformathandling,Unity,unity,json

1.JsonSerializerSettings的使用

JsonSerializerSettings,翻譯過來就是“Json序列化設(shè)置”,看名字就知道是用來幫我們在序列化時進行一些設(shè)置的,我們可以在序列化時對JsonConvert進行一些設(shè)置,達到我們想要的序列化結(jié)果。

需要注意的是JsonSerializerSettings是全局的,對整個JsonConvert生效,對單個屬性的設(shè)置可以看第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 默認(rèn)值設(shè)置

可以使用JsonSerializerSettings.DefaultValueHandling在序列化時進行默認(rèn)值的設(shè)置,主要針對值類型進行設(shè)置,這是一個枚舉類型,包含四個值

DefaultValueHandling 默認(rèn)值設(shè)置
DefaultValueHandling.Include 序列化和反序列化時,包含默認(rèn)值
DefaultValueHandling.Ignore 序列化和反序列化時,忽略默認(rèn)值
DefaultValueHandling.Populate 反序列化時,Json中不包含該字段,該字段有默認(rèn)值的,將被填充默認(rèn)值
DefaultValueHandling.IgnoreAndPopulate 序列化時,忽略默認(rèn)值,反序列化時,填充默認(rèn)值

設(shè)置一下DefaultValueHandling

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

注釋幾個字段

jsonserializersettings.dateformathandling,Unity,unity,json

看一下結(jié)果,可以看到type和time沒有被序列化進去

jsonserializersettings.dateformathandling,Unity,unity,json

1.2 空值設(shè)置

跟上面類似,對引用類型也有JsonSerializerSettings.NullValueHandling對可以為Null的字段進行設(shè)置,同樣也是枚舉類型

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

設(shè)置一下NullValueHandling

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

將引用類型注釋掉

jsonserializersettings.dateformathandling,Unity,unity,json

可以看到為空的string類型的name的被忽略了

jsonserializersettings.dateformathandling,Unity,unity,json

1.3 日期格式設(shè)置

我們可以使用JsonSerializerSettings.DateFormatHandling對Datetime類型的數(shù)據(jù)進行格式設(shè)置

DateFormatHandling 日期格式設(shè)置
DateFormatHandling.IsoDateFormat ISO格式
DateFormatHandling.MicrosoftDateFormat 時間戳格式

設(shè)置一下DateFormatHandling

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

可以看到現(xiàn)在Datetime的格式已經(jīng)變成時間戳的格式了

jsonserializersettings.dateformathandling,Unity,unity,json

2.JsonProperty的使用

使用JsonProperty,翻譯過來是“Json屬性”,可以對標(biāo)記的結(jié)構(gòu)體、類、成員字段等進行標(biāo)記,在序列化時使用不同的策略。

JsonProperty可以對單獨的字段進行設(shè)置,達成和JsonSerializerSettings相同的效果,但只對JsonProperty標(biāo)記的類型生效。

2.1非公共字段序列化

我們知道,在序列化時,會默認(rèn)忽略非公共字段,那么怎么樣才能在序列化時將非公共字段也序列化進去呢,這時候就可以使用JsonProperty進行標(biāo)記。

我們對之前Staff類的私有字段phone進行標(biāo)記

jsonserializersettings.dateformathandling,Unity,unity,json

可以看到之前一直沒被序列化的phone字段成功序列化了出來jsonserializersettings.dateformathandling,Unity,unity,json

2.2指定序列化字段

默認(rèn)序列化公共字段,忽略非公共字段,那有什么版本能讓我們自己指定要不要序列化某些字段呢。

和吃飯拿菜單點菜類似,我們可以在菜單上打勾指定我們想吃的菜,也可以劃掉不想點的菜,剩下的就是我們想要吃的。Newtonsoft.Json也為我們提供了這樣的方式

2.2.1 方式一 OptIn

OptIn就是將整個數(shù)據(jù)結(jié)構(gòu)標(biāo)記為了默認(rèn)不要,使用JsonProperty標(biāo)記的字段才進行序列化

對Staff類使用OptIn進行標(biāo)記

[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就是將整個數(shù)據(jù)結(jié)構(gòu)標(biāo)記成了默認(rèn)要,使用JsonIgnore標(biāo)記的字段忽略序列化

對Staff類使用OptOut進行標(biāo)記

[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 默認(rèn)值設(shè)置

在JsonProperty中也支持我們對默認(rèn)值進行設(shè)置

public class Staff
{
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
    public int id;              //工號
    private string phone;       //手機號
    public string name;         //名字
    public StaffType type;      //類型
    public DateTime time;       //下班時間
}

將id設(shè)置為默認(rèn)值0,看一下輸出,id已經(jīng)被忽略了

jsonserializersettings.dateformathandling,Unity,unity,json

2.4 空值設(shè)置

空值設(shè)置也是一樣的方式

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 日期格式設(shè)置

日期格式的設(shè)置則有不同,可不是像下面這樣的

[JsonProperty(DateFormatHandling = DateFormatHandling.MicrosoftDateFormat)]

Newtonsoft.Json為我們提供了IsoDateTimeConverter這個類用來轉(zhuǎn)換日期,通過JsonConverter進行使用

public class Staff
{
    public int id;              //工號
    private string phone;       //手機號
    public string name;         //名字
    public StaffType type;      //類型
    [JsonConverter(typeof(IsoDateTimeConverter))]
    public DateTime time;       //下班時間
}

當(dāng)然,我們也可以自己重寫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

看一下輸出,已經(jīng)變成了我們自定義的格式

jsonserializersettings.dateformathandling,Unity,unity,json

2.6 自定義字段名稱

有時候我們想要指定序列化時字段的名稱,讓我們在閱讀時更加方便,或者減少占用空間,但又不想改變原來的字段名,就可以使用自定義字段名的方式

jsonserializersettings.dateformathandling,Unity,unity,json

可以看到id序列化時候的字段名已經(jīng)變成了我們自定義的工號了

jsonserializersettings.dateformathandling,Unity,unity,json

2.7 枚舉使用String類型序列化

我們知道Unity的Enum枚舉類型末日使用Value值而不是string名字進行存儲,如果我們一開始沒指定好每個枚舉成員的值,一旦我們在前面或中間插入一個新的枚舉,原來的枚舉數(shù)據(jù)就會發(fā)生偏移,這不是我們想要的結(jié)果。那么有什么方式,能讓我們一開始就使用string名字進行序列化呢,Newtonsoft.Json也為我們提供了這樣一個轉(zhuǎn)換器StringEnumConverter,同樣通過JsonConverter進行使用

jsonserializersettings.dateformathandling,Unity,unity,json

可以看到我們的枚舉類型type已經(jīng)成功地使用string名字進行序列化了

jsonserializersettings.dateformathandling,Unity,unity,json

簡單小結(jié)

本期教了大家在Newtonsoft.Json中對序列化和反序列化進行了一些常用的設(shè)置,還有一些比較不常用的沒有介紹到,比如使用JsonSerializerSettings.ContractResolver來指定序列化時字段名的格式,大家可以自行研究。

很多同學(xué)在使用Json時都會遇到以下這個問題:數(shù)據(jù)結(jié)構(gòu)包含繼承關(guān)系時,反序列時使用基類類型,子類專屬字段會發(fā)生丟失。下一節(jié),我將教大家在Newtonsoft.json中如何解決這樣的問題。

Unity中Newtonsoft.Json的使用(三)文章來源地址http://www.zghlxwxcb.cn/news/detail-849467.html

到了這里,關(guān)于Unity中Newtonsoft.Json的使用(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 怎么在unity3D工程中導(dǎo)入Newtonsoft.Json

    怎么在unity3D工程中導(dǎo)入Newtonsoft.Json

    打開 Unity 編輯器。 轉(zhuǎn)到菜單欄的 “Window”(窗口)選項,然后選擇 “Package Manager”(包管理器) 在搜索框中輸入 “Newtonsoft Json” 進行搜索。 注意:要選擇Unity Registry 在搜索結(jié)果中,會看到 “Newtonsoft Json” 類似名稱的項目。 單擊搜索結(jié)果下方的 “Install”(安裝)按鈕。

    2024年02月02日
    瀏覽(92)
  • 使用Newtonsoft直接讀取Json格式文本(Linq to Json)

    使用 Newtonsoft.Json(通常簡稱為 Newtonsoft)可以輕松地處理 JSON 格式的文本。Newtonsoft.Json 是 .NET 中一個流行的 JSON 處理庫,它提供了豐富的功能和靈活性。 以下是使用 Newtonsoft.Json 進行 Linq to JSON 的示例代碼: 首先,你需要在項目中安裝 Newtonsoft.Json 包。你可以通過 NuGet 包管理

    2024年02月16日
    瀏覽(24)
  • CYQ.Data 操作 Json 性能測試:對比 Newtonsoft.Json

    CYQ.Data 操作 Json 性能測試:對比 Newtonsoft.Json

    在 CYQ.Data?版本更新的這么多年,中間過程的版本都在完善各種功能。 基于需要支持或兼容的代碼越多,很多時候,常規(guī)思維,都把相關(guān)功能完成,就結(jié)束了。 實現(xiàn)過程中,無法避免的會用到大量的反射、鎖等對性能有所影響的邏輯代碼。 CYQ.Data?從V5.9?版本開始,開始大規(guī)

    2024年03月18日
    瀏覽(25)
  • C# Newtonsoft.Json解析json到自定義實體類

    使用Newtonsoft.Json解析json到自定義實體類也很方便,關(guān)鍵點在于實體類定義屬性的時候加上JsonProperty標(biāo)簽。最簡單的一種形式可以形如這樣: JsonProperty后面括弧里的字串即代表json中對應(yīng)的屬性名稱。通過這種方式即可關(guān)聯(lián)json屬性和實體類屬性。 調(diào)用的時候也很簡單, 這樣就

    2024年02月20日
    瀏覽(20)
  • Newtonsoft.Json/Json.NET忽略序列化時的意外錯誤

    在.NET中Newtonsoft.Json(Json.NET)是我們常用來進行Json序列化與反序列化的庫。 而在使用中常會遇到反序列化Json時,遇到不規(guī)則的Json數(shù)據(jù)解構(gòu)而拋出異常。 Newtonsoft.Json?支持序列化和反序列化過程中的錯誤處理。 允許您捕獲錯誤并選擇是處理它并繼續(xù)序列化,還是讓錯誤冒泡并拋

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

    Unity使用Gradle打包方式接入Firebase時配置文件google-services.json遇到的坑

    1、首先在mainTemplate.gradle最上引入 ‘’com.google.gms.google-services’ 如下圖: 2、在mainTemplate.gradle添加任務(wù),將下載下來的google-services.json復(fù)制到gradle項目根目錄下 如下圖: 將你原始文件 google-services.json 中的 package_name 的屬性值 改為 com.unity3d.player 如下圖:

    2024年02月11日
    瀏覽(20)
  • Unity解析json文件(分為json與jsonArray)

    什么是json? JSON是一種取代XML的數(shù)據(jù)結(jié)構(gòu),和xml相比,它更小巧但描述能力卻不差,由于它的小巧所以網(wǎng)絡(luò)傳輸數(shù)據(jù)將減少更多流量從而加快速度, 那么,JSON到底是什么? JSON就是一串字符串 只不過元素會使用特定的符號標(biāo)注。 {} 雙括號表示對象 [] 中括號表示數(shù)組 “” 雙引號內(nèi)是

    2024年02月08日
    瀏覽(19)
  • Unity——JSON的讀取

    在實際中,讀取JSON比保存JSON重要得多。因為存檔、發(fā)送數(shù)據(jù)包往往可以采用其他序列化方法,但游戲的配置文件使用JSON格式比較常見。游戲的配置數(shù)據(jù)不屬于動態(tài)數(shù)據(jù),屬于游戲資源,但很適合用JSON表示。 下面以一個簡單的JSON數(shù)據(jù)文件為例,演示讀取JSON。從整體上看有兩

    2024年02月06日
    瀏覽(17)
  • Unity之Json讀取寫入

    Unity之Json讀取寫入

    JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,主要用于傳送數(shù)據(jù)。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使

    2024年02月05日
    瀏覽(23)
  • Unity自帶方法讀寫JSON文件

    最近使用JSON文件保存模型表情數(shù)據(jù),簡單記錄一下。 首先自定義數(shù)據(jù)類,需要記錄表情每幀的所有BlendShape及時間戳: 使用Unity自帶的JSON讀寫方法: 保存與讀取JSON文件: 簡單記錄,部分變量與方法未展示,僅供參考。

    2024年02月12日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包