zoukankan      html  css  js  c++  java
  • C#(99):JSON与对象的序列化与反序列化

    一、利用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<Person>("{"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<Person>(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;
        }
    }

    三、转换规则

    1. String,char =>string
    2. DBNull,null=>null,"null"
    3. Boolean=>trur/false
    4. int,Double,...=>Number
    5. DateTime..=>"/Date(刻度数)/" ,即用“/”包含。
        eg:/Data(13009188803)/
    6. 枚举数=>整数值 eg:Color.Red=>3
    7. List<T> ,Arrary,ArrayLIst,=>JSON 数组
      eg:new String[]{"2","2","3"}=>["1","2","3"]
    8. Dictionary<TKey,TVlue>,HashTable =>JSON对象
      eg:new Dictionary<int, string> { { 1, "a" }, { 2, "b" }, { 3, "c" } } => {1:"a",2:"b",3:"c"}
    9. 具有公共实例属性或字段的非抽象类 =>JSON对象
      注意:公共只写属性,以及标记[ScriptIgnore]或[IgnoreDataMember]的属性、字段或属性将被忽略。
        eg: {1:"a",2:"b",3:"c"} 好包括”_type“属性。

    四、利用Json.Net三方工具

    https://www.newtonsoft.com/json

    Json.Net(一)介绍:https://www.cnblogs.com/springsnow/p/10605359.html

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

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

    System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
    List<Student> list = new List<Student>();
    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

    https://www.newtonsoft.com/json/help/html/JsonNetVsDotNetSerializers.htm

    性能对比:

    功能对比:

    特性 Json.Net DataContractJsonSerializer JavaScriptSerializer
    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 支持 不支持 不支持
  • 相关阅读:
    [HNOI2008]玩具装箱toy(dp+斜率优化)
    hdu 4597 Play Game(记忆化搜索)
    下载文件,ie文件名称乱码问题
    HDU 2138 How many prime numbers
    Codeforces Round #277 (Div. 2)---A. Calculating Function (规律)
    MapReduce-MulitipleOutputs实现自己定义输出到多个文件夹
    EFM8单片机与I2C外设通信
    linux杂谈(十一):LDAPserver的搭建
    Redis命令学习-string类型操作
    Java 实现单链表反序
  • 原文地址:https://www.cnblogs.com/springsnow/p/9434007.html
Copyright © 2011-2022 走看看