• Json的序列化和反序列化


    一.什么是Json:

      中午肚子饿了,到餐厅点餐。向服务员点了几个菜,厨师根据用户的需求,开始烹饪食物,食物烹饪好后,怎么将食物呈现给用户呢?这时就需要用到盛放食物的碗了。用户拿到盛放食物的碗,就可以获得点的餐了。这个碗就充当了数据交换的容器了(^-^)

      客户端向服务器端发送请求后,服务器端怎么才能把用户需要的数据返回给客户端呢。这时我们就需要用一个指定的格式将数据,按照指定格式返回客户端。这时就有了两种数据传输的方式(XMLJson):

      在普通的Web应用中,不管是服务器端还是客户端解析XML代码会非常麻烦,所以这时Json就更加满足数据传输解析的要求。采用Json格式的方式进行数据的传输,不仅方便传输解析,还特别易于人阅读和编写

    二.XML与Json转换:

    1.常规转换:

    <emp>
        <name>fxhl</name>
        <city>深圳</city>
        <age>23</age>
    </emp>

    转换为Json为:

      {“name”:“fxhl”,"city":"深圳","age":23}

    三.Json的表现形式:

      1.对象:

    {
        "returnCode": "R0000",
        "returnMsg": "成功",
        "lessTimes": "2",
        "domainLink": "",
        "seqNum": "1",
        "identification": "595279",
        "isNeedImageCode": "false"
    }

      2.数组:

    {
        "employees": [
            { "firstName":"John" , "lastName":"Doe" },
            { "firstName":"Anna" , "lastName":"Smith" },
            { "firstName":"Peter" , "lastName":"Jones" }
        ]
    }

      3.数组对象混合:

        这是截取的一小部分,对于比较复杂的Json格式的字符串,可以在线验证json。格式化一个格式。方便观看

        • Json的表现形式一般就三种(对象,数组,字符串),使用过程中,只是将对象与数组进行混合了
    {
        "icon": [
            {
                "title": "尚天猫,就购了",
                "icon_category": "baobei",
                "icon_key": "icon-service-tianmao",
                "trace": "srpservice",
                "innerText": "天猫宝贝",
                "url": "//www.tmall.com/"
            },
            {  
                "title": "保险理赔",
                "position": "99",
                "innerText": "分组-保险理赔",
                "iconPopupComplex": 
           {
    "popup_title": "保险理赔", "subIcons": [ { "dom_class": "icon-service-yunfeixian", "icon_content": "卖家赠送退货运费险" } ] } } ] }

    四.Json序列化和反序列化的三种方式

    1.使用JavaScriptSerializer类:

    //使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dll.中

    using System.Web.Script.Serialization;

     1 class Program
     2 {
     3     static void Main(string[] args)
     4     {
     5         //序列化操作
     6         JavaScriptSerializer jss = new JavaScriptSerializer();
     7         var json = new { name = "fxhl", age = 23 };           
     8         string str = jss.Serialize(json);  
     9         //反序列化操作
    10         Person person = jss.Deserialize<Person>(str);
    11         Console.WriteLine(person.name);
    12     }
    13 }  
    14 [Serializable]      
    15 public class Person
    16 {
    17     public string name { get; set; }
    18     public int age { get; set; }
    19 }

    2.使用DataContractJsonSerializer类:

     //Person实体中的契约 [DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的

    //使用DataContractJsonSerializer方式需要引入的命名空间,在System.Runtime.Serialization.dll.中

     using System.Runtime.Serialization.Json;

     1     static void Main(string[] args)
     2     {
     3         //序列化操作
     4         Person p1 = new Person()
     5         {
     6             name = "fxhl",
     7             age = 23
     8         };
     9         DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Person));
    10         MemoryStream msObj = new MemoryStream();
    11         //将序列化之后的Json格式数据写入流中
    12         js.WriteObject(msObj, p1);
    13         //从0这个位置开始读取流中的数据
    14         msObj.Position = 0;     
    15         StreamReader sr = new StreamReader(msObj, Encoding.UTF8);
    16         string json = sr.ReadToEnd();
    17         Console.WriteLine(json);
    18         sr.Close();
    19         msObj.Close();
    20         //反序列化操作
    21         using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
    22         {
    23             DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Person));
    24             Person model = (Person)deseralizer.ReadObject(ms);// //反序列化ReadObject
    25             Console.WriteLine(model.name);
    26         }
    27         Console.ReadKey();
    28     }
    29 }
    30 [DataContract]     
    31 public class Person
    32 {
    33     [DataMember]
    34     public string name { get; set; }
    35     [DataMember]
    36     public int age { get; set; }
    37 }

    3.使用JSON.NET类库:

    引入类库:

    //使用Json.NET类库需要引入的命名空间

     1 class Program
     2 {
     3 static void Main(string[] args)
     4 {
     5     //序列化操作
     6     var json = new { user = new { name = "fxhl", age = 23 }};
     7     string jsonData = JsonConvert.SerializeObject(json);
     8     Console.WriteLine(jsonData);
     9     //反序列化操作方法一
    10     Person p1= JsonConvert.DeserializeObject<Person>(jsonData);
    11     Console.WriteLine(p1.user.name);
    12     //反序列化操作方法二
    13     string json2 = "[{"user":{"name":"fxhl","age":23}}]";
    14     List<Person> listp2= JsonConvert.DeserializeObject<List<Person>>(json2);
    15     Console.WriteLine(listp2[0].user.name);
    16     Console.ReadKey();
    17 }
    18 }
    19 public class Person
    20 {
    21     public Person user { get; set; }
    22     public string name { get; set; }
    23     public int age { get; set; }
    24 }

     总结:最后还是尽量使用JSON.NET来序列化和反序列化,性能好。

  • 相关阅读:
    世界十大黑客简介
    Workerman
    获取当前页面完整路径的方法:
    冒泡排序
    伪静态规则
    PHP如何打印出curl 模块交互的 http 请求与响应 header?
    转 浅谈 PHP 与手机 APP 开发(API 接口开发)
    银联chinapay支付接口实现详解
    PHP webservice 接口实例
    spl_autoload_register方法
  • 原文地址:https://www.cnblogs.com/fengxuehuanlin/p/5700282.html
Copyright © 2020-2023  润新知