使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象
Json【javascript对象表示方法】,它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的。
Json支持下面两种数据结构:
- 键值对的集合--各种不同的编程语言,都支持这种数据结构;
- 有序的列表类型值的集合--这其中包含数组,集合,矢量,或者序列,等等。
Json有下面几种表现形式
1.对象
一个没有顺序的“键/值”,一个对象以花括号“{”开始,并以花括号"}"结束,在每一个“键”的后面,有一个冒号,并且使用逗号来分隔多个键值对。例如:
var user = {"name":"Manas","gender":"Male","birthday":"1987-8-8"}
2.数组
设置值的顺序,一个数组以中括号"["开始,并以中括号"]"结束,并且所有的值使用逗号分隔,例如:
var userlist = [{"user":{"name":"Manas","gender":"Male","birthday":"1987-8-8"}},
{"user":{"name":"Mohapatra","Male":"Female","birthday":"1987-7-7"}}]
3.字符串
任意数量的Unicode字符,使用引号做标记,并使用反斜杠来分隔。例如:
var userlist = "{"ID":1,"Name":"Manas","Address":"India"}"
好了,介绍完JSON,现在说正题,我们事先序列化和反序列化有三种方式:
1.使用JavaScriptSerializer类
2.使用DataContractJsonSerializer类
3.使用JSON.NET类库
先建立一个Student的对象
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.Serialization; namespace JsonSerializerAndDeSerializer { [DataContract] public class Student { [DataMember] public int ID { get; set; } [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; } [DataMember] public string Sex { get; set; } } } //Student实体中的契约 [DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的,对于其他两种方式不必加,也可以的
1.DataContractJsonSerializer
DataContractJsonSerializer类帮助我们序列化和反序列化Json,他在程序集 System.Runtime.Serialization.dll下的System.Runtime.Serialization.Json命名空间里。
Student stu = new Student() { ID = 1, Name = "曹操", Sex = "男", Age = 1000 }; //序列化 DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Student)); MemoryStream msObj = new MemoryStream(); //将序列化之后的Json格式数据写入流中 js.WriteObject(msObj, stu); msObj.Position = 0; //从0这个位置开始读取流中的数据 StreamReader sr = new StreamReader(msObj, Encoding.UTF8); string json = sr.ReadToEnd(); sr.Close(); msObj.Close(); Console.WriteLine(json); //反序列化 string toDes = json; //string to = "{"ID":"1","Name":"曹操","Sex":"男","Age":"1230"}"; using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(toDes))) { DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Student)); Student model = (Student)deseralizer.ReadObject(ms);// //反序列化ReadObject Console.WriteLine("ID=" + model.ID); Console.WriteLine("Name=" + model.Name); Console.WriteLine("Age=" + model.Age); Console.WriteLine("Sex=" + model.Sex); } Console.ReadKey();
结果:
2.JavaScriptJsonSerializer
Student stu = new Student() { ID = 1, Name = "关羽", Age = 2000, Sex = "男" }; JavaScriptSerializer js = new JavaScriptSerializer(); string jsonData = js.Serialize(stu);//序列化 Console.WriteLine(jsonData); ////反序列化方式一: string desJson = jsonData; //Student model = js.Deserialize<Student>(desJson);// //反序列化 //string message = string.Format("ID={0},Name={1},Age={2},Sex={3}", model.ID, model.Name, model.Age, model.Sex); //Console.WriteLine(message); //Console.ReadKey(); ////反序列化方式2 dynamic modelDy = js.Deserialize<dynamic>(desJson); //反序列化 string messageDy = string.Format("动态的反序列化,ID={0},Name={1},Age={2},Sex={3}", modelDy["ID"], modelDy["Name"], modelDy["Age"], modelDy["Sex"]);//这里要使用索引取值,不能使用对象.属性 Console.WriteLine(messageDy); Console.ReadKey();
结果:
3.JSON.NET(性能最好)
List<Student> lstStuModel = new List<Student>() { new Student(){ID=1,Name="张飞",Age=250,Sex="男"}, new Student(){ID=2,Name="潘金莲",Age=300,Sex="女"} }; //Json.NET序列化 string jsonData = JsonConvert.SerializeObject(lstStuModel); Console.WriteLine(jsonData); Console.ReadKey(); //Json.NET反序列化 string json = @"{ 'Name':'C#','Age':'3000','ID':'1','Sex':'女'}"; Student descJsonStu = JsonConvert.DeserializeObject<Student>(json);//反序列化 Console.WriteLine(string.Format("反序列化: ID={0},Name={1},Sex={2},Sex={3}", descJsonStu.ID, descJsonStu.Name, descJsonStu.Age, descJsonStu.Sex)); Console.ReadKey();
结果:
最佳性能序列化库 Swifter.Json
(1): 最优秀的整型和浮点型 ToString 和 Parse 方法实现。
(2): Emit 实现的高性能对象映射工具。
(3): 本地内存分配!拒绝 .Net 托管二次内存。
(4): 使用线程缓存,让您的程序运行越久速度越快。
(5): 内部全指针运算,相当于使用了 .Net Core 新技术 Span<T>!
安装:Nuget
代码示例
(1): 简单使用
public class Demo { public int Id { get; set; } public string Name { get; set; } public static void Main() { var json = JsonFormatter.SerializeObject(new { Id = 1, Name = "Dogwei" }); var dictionary = JsonFormatter.DeserializeObject<Dictionary<string, object>>(json); var obj = JsonFormatter.DeserializeObject<Demo>(json); } }
(2): 处理重复引用
public class Demo { public int Id { get; set; } public string Name { get; set; } public Demo Instance { get; set; } public static void Main() { var jsonFormatter = new JsonFormatter(JsonFormatterOptions.MultiReferencingReference); var obj = new Demo() { Id = 1, Name = "Dogwei" }; obj.Instance = obj; var json = jsonFormatter.Serialize(obj); var deser = jsonFormatter.Deserialize<Demo>(json); Console.WriteLine(json); // {"Id":1,"Instance":{"$ref":"#"},"Name":"Dogwei"} Console.WriteLine(deser.Instance == deser); // True } }
(3): RWField 特性
public class Demo { [RWField("First Name")] public string Name { get; set; } [RWField] public int Age; [RWField(Access = RWFieldAccess.Ignore)] public int Sex { get; set; } [RWField(Order = 1)] public int Id { get; set; } public static void Main() { var obj = new Demo() { Id = 1, Name = "Dogwei", Age = 22, Sex = 1 }; var json = JsonFormatter.SerializeObject(obj); Console.WriteLine(json); // {"Id":1,"Age":22,"First Name":"Dogwei"} } }
(4): 设置日期格式
public class Demo { public static void Main() { var jsonFormatter = new JsonFormatter(); jsonFormatter.SetDateTimeFormat("yyyy-MM-dd HH:mm:ss"); var json = jsonFormatter.Serialize(DateTime.Now); Console.WriteLine(json); // "2019-02-13 11:03:46" } }
(5): 自定义类型的行为
public class Demo { public string Name { get; set; } public int Sex { get; set; } public bool IsMan { get => Sex == 1; } public unsafe static void Main() { var jsonFormatter = new JsonFormatter(); jsonFormatter.SetValueInterface<bool>(new MyBooleanInterface()); var obj = new Demo() { Name = "Dogwei", Sex = 1 }; var json = jsonFormatter.Serialize(obj); Console.WriteLine(json); // {"IsMan":"yes","Name":"Dogwei","Sex":1} } } public class MyBooleanInterface : IValueInterface<bool> { public bool ReadValue(IValueReader valueReader) { var value = valueReader.ReadString(); switch (value) { case "yes": case "true": return true; case "no": case "false": return false; default: return Convert.ToBoolean(value); } } public void WriteValue(IValueWriter valueWriter, bool value) { valueWriter.WriteString(value ? "yes" : "no"); } }
(6): 设置缓存大小
public class Demo { public static void Main() { HGlobalCache.MaxSize = 1024 * 500; // 500KB var json = JsonFormatter.SerializeObject(new { MaxJsonLength = 256000 }); } }
(7): 序列化超大文件
public class Demo { public static void Main() { var bigObject = new BigObject(); using (FileStream fileStream = new FileStream("/BigObject.json", FileMode.Create, FileAccess.ReadWrite)) { using (StreamWriter streamWriter = new StreamWriter(fileStream)) { JsonFormatter.SerializeObject(bigObject, streamWriter); } } } }
(8): 使用适用小型应用程序的 XObjectRW<T>
public class Demo { public static void Main() { // Default (FastObjectInterface) : 初始化开销较大,内存较大,性能优异。 // XObjectInterface : 初始化开销小,内存占用少,性能也不错。 ValueInterface.DefaultObjectInterfaceType = typeof(XObjectInterface<>); var json = JsonFormatter.SerializeObject(new { Id = 1, Name = "Dogwei" }); Console.WriteLine(json); // {"Id":1,"Name":"Dogwei"} } }
参考:https://www.cnblogs.com/caofangsheng/p/5687994.html