C#对JSON与对象的序列化与反序列化

作者:springsnow 时间:2022-09-07 12:05:08 

一、利用Web服务中的JavaScriptSerializer 类

System.Web.Script.Serialization空间,位于System.Web.extensions.dll中。

JavaScriptSerializer jss = new JavaScriptSerializer();
Console.WriteLine(jss.MaxJsonLength);   //默认接受最大的长度是 2097152    这个是接受JSON字符串的最大长度,超长会有什么后果呢?试下

Person p = new Person(1, "关羽", 21);

//序列化
string json = jss.Serialize(p);
Console.WriteLine(json);    //输出 {"Id":1,"Name":"关羽","Age":21}`这就是Json格式了

//反序列化:1、Deserialize泛型写法
Person p2 = jss.Deserialize("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}");
Console.WriteLine(p2.Id + " " + p2.Name + " " + p2.Age);    //输出 1 关羽 21
//反序列化:2、Deserialize的非泛型写法
Person p3 = jss.Deserialize("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}", typeof(Person)) as Person;  //注意这个方法返回的是object类,因此要强制转换成Person类
Console.WriteLine(p3.Id + " " + p3.Name + " " + p3.Age);    //同样输出 1 关羽 21

//反序列化:3、将Json字符转换为Object类型
object obj = jss.DeserializeObject("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}");  
Person p4 = jss.ConvertToType(obj);    
Console.WriteLine(p4.Name);    
Person p5 = jss.ConvertToType(obj, typeof(Person)) as Person;
Console.WriteLine(p5.Name);  

public class Person
{
   public Person()
   { }
   public Person(int id, string name, int age)
   {
       this.Id = id;
       this.Name = name;
       this.Age = age;
   }
   public int Id { get; set; }
   public string Name { get; set; }
   public int Age { get; set; }
}

二、利用WCF中的JSON类:DataContractJsonSerializer

System.Runtine.Serialization命名空间中,位于System.Runtine,Serialization.dll中。

void Main()
{
   DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Person));
   //最常用的两个方法
   //反序列化
   string str = "{\"Id\":1,\"Name\":\"刘备\",\"Age\":\"23\"}";
   Person p;
   using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str)))     //构造函数能够接受Stream参数,因此你可以用内存流,文件流等等创建
   {
       p = serializer.ReadObject(ms) as Person;
   }
   Console.WriteLine(p.Name);      //输出刘备

//反序列化
   Person p2 = new Person(2, "关羽", 23);
   byte[] byteArr;
   using (MemoryStream ms = new MemoryStream())
   {
       serializer.WriteObject(ms, p2);
       byteArr = ms.ToArray();
   }
   Console.WriteLine(Encoding.UTF8.GetString(byteArr));    //输出 {"Age":23,"Id":1,"Name":"关羽"}
}

[DataContract]      //对于使用DataContractJsonSerializer类而言,该属性是必须的
public class Person
{
   public Person(int id, string name, int age)
   {
       Id = id;
       Age = age;
       Name = name;
   }

[DataMember] //对于使用DataContractJsonSerializer类而言,该属性是必须的
   public int Id
   {
       get;
       set;
   }
   [DataMember]
   public string Name
   {
       get;
       set;
   }
   [DataMember]
   public int Age
   {
       get;
       set;
   }
}

三、转换规则

  • String,char =>string

  • DBNull,null=>null,"null"

  • Boolean=>trur/false

  • int,Double,...=>Number

  • DateTime..=>"\/Date(刻度数)\/" ,即用“\/”包含。 
    eg:\/Data(13009188803)\/

  • 枚举数=>整数值 eg:Color.Red=>3

  • List ,Arrary,ArrayLIst,=>JSON 数组 
    eg:new String[]{"2","2","3"}=>["1","2","3"]

  • Dictionary,HashTable =>JSON对象 
    eg:new Dictionary { { 1, "a" }, { 2, "b" }, { 3, "c" } } => {1:"a",2:"b",3:"c"}

  • 具有公共实例属性或字段的非抽象类 =>JSON对象 
    注意:公共只写属性,以及标记[ScriptIgnore]或[IgnoreDataMember]的属性、字段或属性将被忽略。 
    eg: {1:"a",2:"b",3:"c"} 好包括”_type“属性。

四、利用Json.Net三方工具

https://www.newtonsoft.com/json

Json.Net介绍://www.jb51.net/article/247911.htm

五、JSON序列化过程中日期的处理

1、在c#后台进行处理:通过正则表示式

System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
List list = new List();
list.Add(new Student()
{
   age = 10,
   date = DateTime.Now,
   name = "宋兴柱  是个好孩\"子,这里\"有英文逗号"
});

var str = js.Serialize(list);
str = Regex.Replace(str, @"\\/Date\((\d+)\)\\/", match =>
{
   DateTime dt = new DateTime(1970, 1, 1);
   dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value)).ToLocalTime();
   return dt.ToString("yyyy-MM-dd HH:mm:ss");
});

原本内容:[{"age":10,"date":"\/Date(1404098342309)\/","name":"宋兴柱 是个好孩\"子,这里\"有英文逗号"}] 
显示结果:[{"age":10,"date":"2014-06-30 11:22:15","name":"宋兴柱 是个好孩\"子,这里\"有英文逗号"}]

2、Json.Net中使用IsoDateTimeConverter格式自定义

IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'年'MM'月'dd'日'" };
string json = JsonConvert.SerializeObject(jack, dtConverter);

参考:Json.Net高级用法

3、在JS中进行处理:

接收json数据,日期格式为:"\/Date(1414078309687)\/"

var value = "/Date(1414078309687)/";

var da = eval('new ' + value.replace('/', '', 'g'));
//或者
var da = value.replace(/\/Date\((\d+)\)\//gi, '$1');   ////通过正则拿到里面数。g 全局 i不区分大小写

da.toLocaleDateString()  //2014/10/23
da.toLocaleTimeString()  //下午11:31:49

六、Json.NET 对比 NET Serializers

性能对比:

C#对JSON与对象的序列化与反序列化

功能对比:

特性Json.NetDataContractJsonSerializerJavaScriptSerializer
Json支持支持支持
Bson支持不支持不支持
Json Schema支持不支持不支持
.Net 2.0支持不支持不支持
.Net 3.5支持支持支持
.Net 4.0支持支持支持
Silverlight支持支持不支持
Windows Phone支持支持不支持
Windows 8 Metro支持支持不支持
Linq to Json支持不支持不支持
Indented Json(有换行格式的Json)支持不支持不支持
Json和XML转换支持不支持不支持
序列化DataTable和DataSet支持不支持不支持
序列化Entity Framework支持不支持不支持

来源:https://www.cnblogs.com/springsnow/p/9434007.html

标签:C#,JSON,序列化,反序列化
0
投稿

猜你喜欢

  • 浅谈Spring中单例Bean是线程安全的吗

    2023-07-12 23:42:21
  • 完美解决Android三星手机从图库选择照片旋转问题

    2023-10-11 00:32:53
  • Idea springboot如何实现批量启动微服务

    2022-09-08 09:04:07
  • Java SpringMVC数据响应超详细讲解

    2022-04-08 15:10:26
  • Spring深入探索AOP切面编程

    2023-05-27 09:37:16
  • c#可空类型的作用说明

    2021-12-24 18:00:49
  • JDK14新特性之switch表达式的实现

    2022-06-01 17:49:31
  • Android开发手册shape属性和子属性使用说明

    2023-11-02 09:44:43
  • Android基于Xposed修改微信运动步数实例

    2022-11-06 19:46:57
  • Android Init进程对信号的处理流程详细介绍

    2022-10-25 18:03:31
  • Spring请求参数校验功能实例演示

    2023-04-26 02:05:53
  • 浅谈SpringBoot中的Bean初始化方法 @PostConstruct

    2022-06-11 07:21:17
  • Android手势密码的实现

    2023-03-09 09:23:01
  • Java的动态绑定与双分派_动力节点Java学院整理

    2021-07-14 11:18:50
  • Android开发使用strings.xml多语言翻译解决方案

    2023-06-27 14:19:24
  • java文件操作之Path,Paths,Files

    2023-11-19 15:34:34
  • Android第三方开源下拉框NiceSpinner使用详解

    2023-01-04 11:10:29
  • Android巧用DecorView实现对话框功能

    2022-07-14 14:03:40
  • Java中五种不同方法的创建对象

    2021-07-25 01:11:37
  • 关于统计数字问题的算法

    2023-11-03 00:33:32
  • asp之家 软件编程 m.aspxhome.com