JSON
注意事项:
- Newtonsoft、LitJson都可以转成List和数组
- Newtonsoft可以转成任意key的字典,LitJson只能转成key为string类型的字典
- Newtonsoft转成json可保留汉字,LitJson会把汉字转成十六进制Unicode码
- Newtonsoft 序列化 / 反序列化抽象类、接口时,创建一个JsonSerializerSettings类,其中字段TypeNameHandling设置为All或者Auto,序列化 / 反序列化时把这个setting类传参进去,就正常了
Newtonsoft存储字典Dictionary的结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| { "0": { "id": 0, "status": "返回值为0", "metaData": { "saas_username": "已退出0", "saas_groupname": "gr0" } }, "1": { "id": 1, "status": "返回值为1", "metaData": { "saas_username": "已退出1", "saas_groupname": "gr1" } } }
|
但是如果key用复杂类型,比如MetaData,则存储后会变成类似”JustStudy.C01_Json+MetaData”: {…}这种鬼样子,命名空间.类名+key类名
Newtonsoft
[JsonIgnore] 忽略public的字段、属性
[DefaultValue(10)] 成员默认值(只能修饰值类型?)
[JsonProperty] 默认不会序列化private对象,加上这个修饰就可以序列化了
[JsonConverter] 继承自JsonConverter类,就可以按照自定义方式来序列化
[OptOut] 修饰类,所有公有成员会被序列化,成员加JsonIgnore不序列化
[OptIn] 修饰类,所有的成员不会被序列化,成员加JsonProperty序列化
举例:[JsonObject(MemberSerialization.OptIn)]
[JsonConverter(typeof(StringEnumConverter))] 枚举按照string类型来序列化
[DefaultValue(10)] 属性成员添加默认值
JsonSerializerSettings.DefaultValueHandling
JsonSerializerSettings.NullValueHandling 空值的处理,比如空值不序列化?
[JsonConverter(typeof(IsoDateTimeConverter))] 日期类型转换成Iso,或者自己继承一个
[JsonProperty(PropertyName = “CName”)] 自定义属性名称
常规序列化与反序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| string json= JsonConvert.SerializeObject(product); Product product = JsonConvert.DeserializeObject<Product>(json);
public static string FormatJsonString(string str) { JsonSerializer serializer = new JsonSerializer(); TextReader tr = new StringReader(str); JsonTextReader jtr = new JsonTextReader(tr); object obj = serializer.Deserialize(jtr); if (obj != null) { StringWriter textWriter = new StringWriter(); JsonTextWriter jsonWriter = new JsonTextWriter(textWriter) { Formatting = Formatting.Indented, Indentation = 4, IndentChar = ' ' }; serializer.Serialize(jsonWriter, obj); return textWriter.ToString(); } else { return str; } }
|
动态忽略某些属性不进行序列化(比如Vector3中的magnitude)
1.定义类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class JsonSettings { static JsonSettings() { IgnoreSerializerProperty = new JsonSerializerSettings { ContractResolver = new IgnorePropertyContractResolver(new List<string> { "gamma", "linear", "grayscale","maxColorComponent", "magnitude", "sqrMagnitude" }), }; }
public static JsonSerializerSettings IgnoreSerializerProperty { get; set; } public class IgnorePropertyContractResolver : DefaultContractResolver { private readonly List<string> ignoreProperty; public IgnorePropertyContractResolver(List<string> ignoreProperty)
{ this.ignoreProperty = ignoreProperty; } protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { IList<JsonProperty> propertyList = base.CreateProperties(type, memberSerialization); propertyList = propertyList.Where(p => ignoreProperty.FirstOrDefault(o => o == p.PropertyName) == null).ToList(); return propertyList; } } }
|
3.使用自定义setting
1
| JsonConvert.SerializeObject(xxx, JsonSettings.IgnoreSerializerProperty)
|
日期类型转成yyyy-MM-dd 或者yyyy-MM-dd HH:mm:ss格式
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class ChinaDateTimeConverter : DateTimeConverterBase { private static IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" }; public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return dtConverter.ReadJson(reader, objectType, existingValue, serializer); }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { dtConverter.WriteJson(writer, value, serializer); } }
|
LitJson
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Entity[] arr = JsonMapper.ToObject<Entity[]>(json);
string json = JsonMapper.ToJson(lstEntity);
JsonData data = new JsonData();
data["name"] = "peiandsky";
data["info"] = new JsonData();
data["info"]["sex"] = "male";
data["info"]["age"] = 28;
string json = data.ToJson();
SimpleJson
|
SimpleJson