• C#解析json的几种方式


    json格式的数据是javascript原生的一种数据格式,比xml更简洁。

    它有两种形式:json对象和json对象数组。

    在此之前,有必要解释几个基本概念:

    json字符串,就是string,它一定是由双引号包起来的,如"{'name':'jerry'}"。这是一个string,尽管去掉双引号后它就是一个json对象。

    json对象,就是以大括号开头的对象,如{"name":"jerry"}; 而获取name值的方式就是 json.name 或者 json["name"];

    json数组,就是以中括号开头的json对象数组,如[{"name":"tom"},{"name":"jerry"}];获取值的方式是 json[0].name 或 json[0]["name"]; //这里取第一个name

    搞清楚基本概念后,理解起来就容易了。

    而把符合json格式的string,转换成json对象并提取其中值的方法,就是本文要重点介绍的。

    (一):引用 newtonsoft.json.linq命名空间

    json对象

    在C#中可以,利用其JObject类进行一些操作:

    string json = "{'name':'terry','age':'21'}";
    JObject jsonObj = JObject.Parse(json); //尝试将字符串转换成json对象
    string name = jsonObj["name"]; //在js中习惯用jsonObj.name,这里不行
    string age = jsonObj["age"];
    Response.Write(name + "<br />" + age);

    json数组

    类似JObject,这里借助JArray类:

    string json = "[{'name':'tom'},{'name':'jerry'},8,10]";
    JArray arr = JArray.Parse(json); //尝试将字符串转换成json数组
    Response.Write(arr[1]["name"]); //输出jerry

    其实这个json数组很奇怪,第三个和第四个没有键值对了,就一个值,也是可以解析的:

    Response.Write( arr[3] );   //输出10

    (二):引用 newtonsoft.json命名空间

      1.需要建立与json相对应的类:

     public class Person
     {
          public string Name { get; set; }
          public int Age { get; set; }
     }

       2.string转对象

    string json = "{'Name':'tom','Age':'21'}";
    Person p = JsonConvert.DeserializeObject<Person>(json); //将字符串转换成json对象
    Response.Write(p.Name); //输出tom.这里不能p["Name"]

       3.string转数组

    string json = "[{'Name':'a','Age':1},{'Name':'b','Age':2}]";
    List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json);//用List作为容器装Person数组
    Response.Write(persons[0].Name); //输出a.这里不能persons[0]["Name"]

    这个把string转换成对象或者数组的过程,叫做反序列化。

    说到反序列化,顺便提一下序列化。

    序列化,指把对象和数组变为字符串的过程。

    例1.

    Person p = new Person(){Name="jerry" , Age=23};
    string json = JsonConvert.SerializeObject(p);

    例2.

    List<Person> persons=new List<Person>()
     {
          new Person(){ Name="a",Age=1},
          new Person(){ Name="b",Age=2},
          new Person(){ Name="c",Age=3},
          new Person(){ Name="d",Age=4}
     };
    string json = JsonConvert.SerializeObject(persons)

     这里不区分JArray和JObject,都是用JsonConvert.SerializeObject()方法;

    (三):引用 System.Web.Script.Serialization命名空间

    这个的好处在于适合某些没有newtonsoft.dll文件的环境

    用法和(二)也差不多,只不过不再是静态方法,而是需要实例化

       1.建立与json相对应的类:

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

       2.string转对象

    string json = "{'Name':'tom','Age':'21'}";
    Person p = (Person)new JavaScriptSerializer().Deserialize(json, new Person().GetType()); //将字符串转换成json对象
    Response.Write(p.Name); //输出tom.这里不能p["Name"]

       3.string转数组

    string json = "[{'Name':'a','Age':1},{'Name':'b','Age':2}]";
    List<Person> persons = (List<Person>)new JavaScriptSerializer().Deserialize(json, new List<Person>().GetType());//用List作为容器装Person数组
    Response.Write(persons[0].Name); //输出a.这里不能persons[0]["Name"]

    这是反序列化,下面讲序列化

    例1.

    Person p = new Person(){Name="tom" , Age=23};
    string json = new JavaScriptSerializer().Serialize(p);

    例2.

    List<Person> persons=new List<Person>()
      {
             new Person(){ Name="a",Age=1},
             new Person(){ Name="b",Age=2},
             new Person(){ Name="c",Age=3},
             new Person(){ Name="d",Age=4}
      };
    string json = new JavaScriptSerializer().Serialize(persons);

    序列化的时候同样不区分对象或是数组。

    它与(二)的区别,据说是效率问题(二效率更高),没有具体考证过。

  • 相关阅读:
    gitlab配置ssh连接
    java 函数编程之Consumer接口的使用
    一枚程序猿的MacBook M1详细体验报告
    【线上问题排查技巧】动态修改LOGGER日志级别
    【线上排查实战】AOP切面执行顺序你真的了解吗
    阿里巴巴Canal常见问题:重复解析/Filter失效/消费落后
    使用Binlog日志恢复误删的MySQL数据实战
    Git实战技巧:恢复被强制push -f失踪的代码
    一次完整的JVM堆外内存泄漏故障排查记录
    Java线上问题排查神器Arthas快速上手与原理浅谈
  • 原文地址:https://www.cnblogs.com/dengshaojun/p/4097037.html
Copyright © 2020-2023  润新知