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 支持 不支持 不支持
  • 相关阅读:
    【Hadoop学习之十三】MapReduce案例分析五-ItemCF
    【Hadoop学习之十二】MapReduce案例分析四-TF-IDF
    【Hadoop学习之十】MapReduce案例分析二-好友推荐
    【Hadoop学习之九】MapReduce案例分析一-天气
    【Hadoop学习之十一】MapReduce案例分析三-PageRank
    RPC(Remote Procedure Calls)远程过程调用
    基于java开源区块链Blockchain相关项目介绍
    按 file 分组统计视图 | 全方位认识 sys 系统库
    内存分配统计视图 | 全方位认识 sys 系统库
    按 host 分组统计视图 | 全方位认识 sys 系统库
  • 原文地址:https://www.cnblogs.com/springsnow/p/9434007.html
Copyright © 2011-2022 走看看