Unity自己的Json序列化是不支持字典格式的,而且功能比较单一,这里介绍一个.Net中开源的Json序列化和反序列化库和基本用法以及常用的数据处理方法(github地址:https://github.com/JamesNK/Newtonsoft.Json/releases )(百度网盘:链接:https://pan.baidu.com/s/1S4cQW3NoU-g5AMPZ8VKzvQ 提取码:b19e ),

数据处理接口

这里的接口包含数据序列化反序列化两个方法,因为可能会碰到Json,Xml,二进制或者其他的结构。

public interface IObjectSerializer
{string Serializer<T>(T obj);T DeSerializer<T>(string content);}

设置Json键统一

数据处理时我们可以设置 JsonSerializerSettings ,在数据处理时字段名转换为驼峰命名法,(比如我们客户端用的是大驼峰法,Java服务器习惯用的小驼峰法)也就是说当我们客户端的代码为 pubilc string Name = "Alice";时,经过序列化后的字符串后会变为 "name"="Alice",而不是"Name" = "Alice";

ContractResolver = new CamelCasePropertyNamesContractResolver()对 JSON 数据使用混合大小写。驼峰式,但是是javascript 首字母小写形式.

当然我们也可以继承DefaultContractResolver,重写ResolveContract方法去处理其他格式的字段名比如说字段名全小写,或者去除字段下划线。

另外这里序列化的类可以使用单利模式处理,这里因为要另外上传单利模板类,为了方便大家直接拿到可以使用,我就不再麻烦写了。

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;public class JsonObjectSerializer : IObjectSerializer
{private readonly JsonSerializerSettings settings = new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() };public T DeSerializer<T>(string content){if (typeof(T)==typeof(string)){return (T)(object)content;}else{return JsonConvert.DeserializeObject<T>(content);}}public string Serializer<T>(T obj){return JsonConvert.SerializeObject(obj, this.settings);}
}

空值类型处理

当我们反序列化中碰到不可为空的数据类型,而传过来的json中值是null时,会出现反序列化失败比如说Java中的包装类型 int number =null,如果我们C#中直接用 int number; 去接这个数据时就会出错,当然我们也可以提前设置为可空类型的int,int? number = null;或者 Nullable<int> a = null;

也可以用下面这种实现JsonConVerter方法来处理

[JsonConverter(typeof(ValueTypeNullToDefaultConverter))]
           public long Id { get; set; }

当接收到的是 { "Id" = null } 会序列化为 long类型的默认值 0  Id = 0;

using Newtonsoft.Json;
using System;
using UnityEngine;public class ValueTypeNullToDefaultConverter : JsonConverter
{public override bool CanConvert(Type objectType){return objectType.IsValueType;}public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer){if (reader.Value == null){return Activator.CreateInstance(objectType);}return this.ChangeType(reader.Value, objectType);}public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer){writer.WriteRawValue(value == null ? null : value.ToString());}public object ChangeType(object value, Type objectType){if (value == null){return null;}try{return Convert.ChangeType(value, objectType);}catch (Exception ex){Debug.LogError(string.Format("[ChangeType]:Failed to change object value '{0}' to object type '{1}',Exception:{2}", value, objectType.Name,ex));return null;}}
}

日期格式处理

DateTime类型系统自带的会格式化成iso日期标准"UpdateTime" = "2019-03-31T00:00:00",但是实际使用过程中我们可能要的是yyyy-MM-dd或者yyyy-MM-dd HH:mm:ss,或者是传给后台的减去自己所在时区的毫秒数,或者后台传回来的毫秒数要加上自己当前时区的毫秒数,这里给出的后一种的解决办法。

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;public class UnixDateTimeConverter : DateTimeConverterBase
{public static readonly DateTime BaseTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);public static readonly DateTime StartTime = TimeZone.CurrentTimeZone.ToLocalTime(BaseTime);//当地时区public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer){if (reader.Value ==null){return null;}return BaseTime.AddMilliseconds((long)reader.Value).ToLocalTime();}public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer){if (value!=null){var dateTime = (DateTime)value;writer.WriteRawValue(((long)(dateTime - StartTime).TotalMilliseconds).ToString());}}
}

枚举值自定义格式化

一般情况下枚举值的序列化会自动格式化成枚举对应的整型数值,比如说:

pubilce enum Gender

{

Male = 0,

Female = 1,

Unknown

}

public Gender Gender = Male;

序列化后为:{"Gender:0"}

只要在 Gender属性上机上JsonConverter(typeof(StringEnumConverter))表示将枚举值转换成对应的字符串,而StringEnumConverter是Newtonsoft.Json内置的转换类型。最终输出结果 {"Gender" = "Male"}

忽略某些属性

当我们遇到接口优化,实体中有些属性不需要序列化返回,可以用该特性,比如说我们在一个实体类中有10个字段,但其中有一个属性序列化后会占用大量的字节,并且这个属性服务器是不需要的,仅供我们客户端逻辑使用。如果这些数据都上传到服务器,会造成带宽的占用,也就是说40K的数据中,会有20K的无效数据,我们要做的就是优化掉这些无效的数据。

OptOut 默认值,类中所有公有成员会被序列化,如果不想被序列化,可以用特性JsonIgnore
OptIn 默认情况下,所有的成员不会被序列化,类中的成员只有标有特性JsonProperty的才会被序列化,当类的成员很多,但客户端仅仅需要一部分数据时,很有用

[JsonObject(MemberSerialization.OptIn)]

public class UserInfo

{

[JsonProperty]

pubilc string Name { get;set; }

pubilc int Age { get;set; }

}

序列化输出 { "Name" = "Alice" } 只输出姓名字段

[JsonObject(MemberSerialization.OptOut)]

public class Person

{

public int Age { get; set; }

[JsonIgnore]

public string Name { get; set; }

}

序列化输出为{ "Age" = "18" },忽略姓名字段

其他处理

using Newtonsoft.Json;
using System;
using System.Collections.Generic;public class UserInfo
{[JsonConverter(typeof(ValueTypeNullToDefaultConverter))]public long Id { get; set; }[JsonProperty("name")]//将json中的name反序列化时转为UserNamepublic string UserName { get; set; }[JsonConverter(typeof(UnixDateTimeConverter))]public DateTime Birthday { get; set; }[JsonProperty(ItemConverterType =typeof(UnixDateTimeConverter))]public List<DateTime> LoginTime { get; set; }
}

Newtonsoft.Json序列化库相关推荐

  1. [C#][Newtonsoft.Json] Newtonsoft.Json 序列化时的一些其它用法

    Newtonsoft.Json 序列化时的一些其它用法 在进行序列化时我们一般会选择使用匿名类型 new { },或者添加一个新类(包含想输出的所有字段).但不可避免的会出现以下情形:如属性值隐藏(敏 ...

  2. 黑马程序员python笔记_#华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库...

    [小宅按]在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化. ...

  3. MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式

    MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式 2015-01-18 00:11 https://www.muhanxue.com/essa ...

  4. #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库

    在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化.但是这种序 ...

  5. json支持的最大长度_Swifter.Json 可能是 .Net 平台迄今为止性能最佳的 Json 序列化库【开源】...

    Json 简介 Json (JavaScript Object Notation) 是一种轻量级的数据交换格式.它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如:阿里爸爸的 fast ...

  6. MVC日期格式化,后台使用Newtonsoft.Json序列化日期,前端使用”f”格式化日期

    MVC控制器中,经常使用Newtonsoft.Json把对象序列化成json字符串传递到前端视图.当对象中有DateTime类型的属性时,前后台如何处理才能把DateTime类型转换成想要的格式呢? ...

  7. C# newtonsoft.json 序列化实体进行驼峰命名(第一个首字母小写)

    #使用newtonsoft.json来设置格式化 var Model = new UserIModel { UserName = "xiaoming", UserId = '1' ...

  8. Java json序列化库gson(2)

    2019独角兽企业重金招聘Python工程师标准>>> 基于策略(自定义规则) 上面介绍的了3种排除字段的方法,说实话我除了@Expose以外,其它的都是只在Demo用上过,用得最多 ...

  9. Newtonsoft.Json 序列化和反序列化 以及时间格式 2

    一.JSON使用JsonPropertyAttribute重命名属性名 1.先创建一个Movie对象,然后在其属性上添加JsonProperty,并指定重命名的名称.注意:属性Name和Directo ...

最新文章

  1. java模拟器未载入,由于“活页夹线程池”,应用程序未在模拟器上运行
  2. 安装wamp时出现httpd.exe无法找到组件MSVCR100.dll的解决办法
  3. Python递归调用
  4. java序列化错在哪里_Spark序列化错误:java.io.NotSerializableException
  5. 【非常基础实践】 微信小程序 - 腾讯云 - PHP - DEMO - 002 - 云环境搭建和开通指引- 实践
  6. Keepalived+nginx+redis主从+tomcat一机多实例实现会话共享
  7. SQL关于数据库完整性
  8. 2021年四川省卫生副高考试成绩查询时间,2021年四川卫生资格成绩查询时间及查分入口【6月4日起】...
  9. 欧姆龙CP-X显示 END重复 以及 条 0 -重叠条
  10. 怎么理解函数式编程?
  11. 设置单行省略的时候在搜狗浏览器里面导致页面布局紊乱
  12. php 远程下载木马
  13. Foxmail登录各种邮箱方法汇总
  14. 《研磨设计模式》 与 《设计模式之禅》对比
  15. 异常:“ERROR: Permission to XXX.git denied to user”终极解决方案
  16. 如何使用CorelDRAW 2019快速制作幻影图像效果
  17. pairs和iparis
  18. 朴素贝叶斯(演示结果与SVM进行对比)
  19. 桂林电子科技大学计算机学院钟艳如,桂林电子科技大学考研研究生导师简介-钟艳如...
  20. 历史辩证唯物主义下的金融业发展的思考*

热门文章

  1. python try 嵌套_exception:如何在Python中安全地创建嵌套目录?
  2. MinIO高性能对象存储
  3. (五)DSP28335基础教程——外部中断控制(按键触发)
  4. java ip过滤器_java实现IP地址过滤
  5. linux内核源码解压
  6. 谈谈proxy的安全问题
  7. 美股当红炸子鸡Zoom“不务正业”卖硬件,这背后藏着它什么野心?
  8. m基于K-means聚类算法和神经网络的模糊控制器设计matlab仿真
  9. Revit 中注释族的应用详解及公共族库工具
  10. 如何在项目中引用字体包