目錄
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)不序列化
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;
}
注釋幾個字段
看一下結(jié)果,可以看到type和time沒有被序列化進去
1.2 空值設(shè)置
跟上面類似,對引用類型也有JsonSerializerSettings.NullValueHandling對可以為Null的字段進行設(shè)置,同樣也是枚舉類型
NullValueHandling | 值類型 |
---|---|
NullValueHandling.Include | 序列化和反序列化時,包含空字段 |
NullValueHandling.Ignore | 序列化和反序列化時,忽略空字段 |
設(shè)置一下NullValueHandling
static JsonMgr()
{
settings = new JsonSerializerSettings();
settings.NullValueHandling = NullValueHandling.Ignore;
}
將引用類型注釋掉
可以看到為空的string類型的name的被忽略了
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)變成時間戳的格式了
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)記
可以看到之前一直沒被序列化的phone字段成功序列化了出來
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; //下班時間
}
看一下輸出,只序列化了我們指定的字段
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; //下班時間
}
再看一下輸出,可以看到把我們不要的字段忽略了
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)被忽略了
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也被忽略了
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?
看一下輸出,已經(jīng)變成了我們自定義的格式
2.6 自定義字段名稱
有時候我們想要指定序列化時字段的名稱,讓我們在閱讀時更加方便,或者減少占用空間,但又不想改變原來的字段名,就可以使用自定義字段名的方式
可以看到id序列化時候的字段名已經(jīng)變成了我們自定義的工號了
2.7 枚舉使用String類型序列化
我們知道Unity的Enum枚舉類型末日使用Value值而不是string名字進行存儲,如果我們一開始沒指定好每個枚舉成員的值,一旦我們在前面或中間插入一個新的枚舉,原來的枚舉數(shù)據(jù)就會發(fā)生偏移,這不是我們想要的結(jié)果。那么有什么方式,能讓我們一開始就使用string名字進行序列化呢,Newtonsoft.Json也為我們提供了這樣一個轉(zhuǎn)換器StringEnumConverter,同樣通過JsonConverter進行使用
可以看到我們的枚舉類型type已經(jīng)成功地使用string名字進行序列化了
簡單小結(jié)
本期教了大家在Newtonsoft.Json中對序列化和反序列化進行了一些常用的設(shè)置,還有一些比較不常用的沒有介紹到,比如使用JsonSerializerSettings.ContractResolver來指定序列化時字段名的格式,大家可以自行研究。
很多同學(xué)在使用Json時都會遇到以下這個問題:數(shù)據(jù)結(jié)構(gòu)包含繼承關(guān)系時,反序列時使用基類類型,子類專屬字段會發(fā)生丟失。下一節(jié),我將教大家在Newtonsoft.json中如何解決這樣的問題。文章來源:http://www.zghlxwxcb.cn/news/detail-849467.html
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)!