使用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 = ,
Name = "曹操",
Sex = "男",
Age =
};
//序列化
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Student));
MemoryStream msObj = new MemoryStream();
//将序列化之后的Json格式数据写入流中
js.WriteObject(msObj, stu);
msObj.Position = ;
//从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 = ,
Name = "关羽",
Age = ,
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=,Name="张飞",Age=,Sex="男"},
new Student(){ID=,Name="潘金莲",Age=,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 = , 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 = , 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 = )]
public int Id { get; set; } public static void Main()
{
var obj = new Demo() { Id = , Name = "Dogwei", Age = , Sex = }; 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 == ; } public unsafe static void Main()
{
var jsonFormatter = new JsonFormatter(); jsonFormatter.SetValueInterface<bool>(new MyBooleanInterface()); var obj = new Demo() { Name = "Dogwei", Sex = }; 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 = * ; // 500KB var json = JsonFormatter.SerializeObject(new { MaxJsonLength = });
}
}

(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 = , Name = "Dogwei" }); Console.WriteLine(json); // {"Id":1,"Name":"Dogwei"}
}
}

参考:https://www.cnblogs.com/caofangsheng/p/5687994.html

最新文章

  1. STM32F429i-DISCO FreeRTOS keil STM32CubeMX
  2. Dom学习笔记
  3. oc中定时器的基本使用
  4. 修改cms 管理栏目路径
  5. FatMouse&#39; Trade_贪心
  6. machine learning-----&gt;什么是机器学习
  7. EasyUI Tree判断节点是否是叶
  8. Client-Side UI Automation Provider - WinForm Sample
  9. Error configuring application listener of class org.springframework.web.cont
  10. [转载]lib和dll文件的区别和联系
  11. CSS Grid
  12. Fibonacci快速实现(优化)
  13. iOS 11开发教程(十七)iOS11应用视图之使用按钮接收用户输入
  14. android studio每次启动都要在fetching Android sdk compoment information停好久 怎么解决?
  15. Easyui入门视频教程 第04集---Easyui布局
  16. PID算法(C语言)
  17. Decorator Wrapper 装饰模式 MD
  18. 在VC中创建DLL文件的方法步骤
  19. Linux实用命令之xdg-open
  20. setInterval 与 clearInterval详解

热门文章

  1. 学Python的第八天
  2. python面向对象的三大特征--继承
  3. AutoLayout面试题记录-自动布局
  4. python 全栈开发,Day45(html介绍和head标签,body标签中相关标签)
  5. CodeForces - 35D
  6. 2019 年百度之星&#183;程序设计大赛 - 复赛 Diversity (树形DP)
  7. instagram
  8. 【进阶技术】一篇文章搞掂:RibbitMQ
  9. CentOS7.4下载与安装 、使用
  10. django中的url控制