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类进行一些操作:

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

json数组

类似JObject,这里借助JArray类:

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

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

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

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

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

  1. public class Person
  2. {
  3. public string Name { get; set; }
  4. public int Age { get; set; }
  5. }

   2.string转对象

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

   3.string转数组

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

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

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

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

例1.

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

例2.

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

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

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

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

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

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

  1. public class Person
  2. {
  3. public string Name { get; set; }
  4. public int Age { get; set; }
  5. }

   2.string转对象

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

   3.string转数组

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

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

例1.

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

例2.

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

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

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

C#解析json的几种方式的更多相关文章

  1. unity解析json的两种方式

    一直比较钟情于json,用来做数据交互,堪称完美!下面简单说一下unity使用C#脚本如何解析json数据吧. 一.写解析类,借助于JsonUtility.FromJson 直接给个例子吧 1.jso ...

  2. 解析JSON的三种方式

    JSONObject   JSONObject jsonObject = new JSONObject(strJson); JSONArray jsonArray = jsonObject.getJS ...

  3. 解析JSON有俩种方式:JSONObject和GSON

    JSONObject: //JSONObject解析JSON文件 private void parseJSONWithJSONObject(String json_data) { try { JSON ...

  4. C#解析json的两种方式

    C#中Json转换主要使用的几种方法! 这篇主要介绍2.4.第三种方法使用的比较局限,所以我没有深入学习. 第二种方法 我使用比较多的方式,这个方法是.NET内置的,使用起来比较方便 A.利用seri ...

  5. go 中解析JSON的三种姿势

    背景 这是一篇写给0-1年新人的文章,短平快的教会你如何解析json字符串. 示例Json 假设有如下json字符串: { "userName":"admin" ...

  6. 解析JSON的两种方法eval()和JSON.parse()

    解析JSON 一种方法是使用eval函数. var dataObj = eval("("+json+")"); 必须把文本包围在括号中,这样才能避免语法错误,迫 ...

  7. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  8. Golang解析json的几种方法

    Golang解析json的几种方法 概要 使用Golang调用其它平台API接口时总会被多层的json串给恶心到,我记录一下自己解析json的几种方法. 一.自带的json包 func JsonUnm ...

  9. JAVA解析XML的四种方式

    java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...

随机推荐

  1. UNIX网络编程——TCP 滑动窗口协议

    什么是滑动窗口协议?     一图胜千言,看下面的图.简单解释下,发送和接受方都会维护一个数据帧的序列,这个序列被称作窗口.发送方的窗口大小由接受方确定,目的在于控制发送速度,以免接受方的缓存不够大, ...

  2. lk中内联调用的dsb()

    lk中内联调用的dsb() 比如lk的uart_dm_init()函数就调用了dsb() /* Configure the uart clock */ clock_config_uart_dm(id) ...

  3. mysql DISTINCT 的实现与优化

    DISTINCT实际上和GROUP BY的操作非常相似,只不过是在GROUP BY之后的每组中只取出一条记录而已.所以,DISTINCT的实现和GROUP BY的实现也基本差不多,没有太大的区别.同样 ...

  4. 2015年iOS开发工程师前景分析

    "互联网+"概念的提出催生了大量互联网企业,越来越多的传统行业需要与互联网更深地渗透与融合.而在这股互联网化的浪潮中,行业却发现找不到优秀的互联网人才. 互联网企业数量持续增长,用 ...

  5. Android反编译获取资源文件-android学习之旅(69)

    有时候你看到一些很好看的布局,会考虑别人怎么实现的,回想参考一下,那么这时候反编译一下是很必要的. 要用到的工具apktool.bat和aapt.exe和apktool.jar(要最新版本) 下载前两 ...

  6. 08_Android中的SimpleAdapter的使用

     1 目的界面 2.编写Android清单文件 <?xml version="1.0" encoding="utf-8"?> <manif ...

  7. Variant does not reference an auomation object

    今天两个用户突然报错. 应用场景:审核或撤审核 字面意思:变量无法映射到对象,应该是调用对象的时候找不到.会不会是杀毒软件删除掉了. 两个用户都用了瑞星杀毒,哥不是黑,确实.应该是审核元被删掉 了. ...

  8. H5学习之旅-H5的块标签的使用(9)

    块元素的基本语法 1. Html块元素 ,块元素在开始时候通常以新行开始,比如h1,p,ul 2.内联元素,通常不会以新行开始,比如a,b,img 3.html的div元素,div也被称为块元素,其主 ...

  9. 一篇详细的linux中shell语言的字符串处理

    1 cut是以每一行为一个处理对象的,这种机制和sed是一样的.(关于sed的入门文章将在近期发布) 2 cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢? cut命令主要 ...

  10. 《java入门第一季》之面向对象(多态向下转型)

    上一篇博客(http://blog.csdn.net/qq_32059827/article/details/51328638)最后对多态的弊端做了显示,这里解决这个弊端.如下: /* 多态的弊端: ...