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[]["name"]); //输出jerry

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

Response.Write( arr[] );   //输出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[].Name); //输出a.这里不能persons[0]["Name"]

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

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

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

例1.

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

例2.

List<Person> persons=new List<Person>()
{
new Person(){ Name="a",Age=},
new Person(){ Name="b",Age=},
new Person(){ Name="c",Age=},
new Person(){ Name="d",Age=}
};
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[].Name); //输出a.这里不能persons[0]["Name"]

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

例1.

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

例2.

List<Person> persons=new List<Person>()
{
new Person(){ Name="a",Age=},
new Person(){ Name="b",Age=},
new Person(){ Name="c",Age=},
new Person(){ Name="d",Age=}
};
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. How to Find the Self Service Related File Location and Versions

     How to Find the Self Service Related File Location and Versions (文档 ID 781385.1) In this Document ...

  2. 【shell脚本】mysql每日备份shell脚本

    每天固定时间用mysqldump 备份mysql数据. #!/bin/bash #每天早上4点, mysql备份数据 orangleliu #chmod 700 backup.sh #crontab ...

  3. Android Studio科普篇——2.误区

    1.删除一行是ctrl+x? 这是一个被谣传得很广泛的快捷键,但其实删除一行的快捷键不是ctrl+x,而是ctrl+y.ctrl+x在不选中内容的情况下,是剪切当前行,而ctrl+y才是删除当前行,它 ...

  4. Cocos2D中的纹理(textures)的解释

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  5. java设计模式---合成模式2

    合成模式属于对象的结构模式,有时又叫做"部分--整体"模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式 ...

  6. 我眼中的Linux设备树(五 根节点)

    五 根节点一个最简单的设备树必须包含根节点,cpus节点,memory节点.根节点的名字及全路径都是"/",至少需要包含model和compatible两个属性.model属性我们 ...

  7. Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)

    前一段时间再次拜读<Inside the C++ Object Model> 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transfor ...

  8. awk字符串函数及其意义

     awk字符串函数及其意义 awk提供了强大的内置字符串函数,用于实现文本的字符串替换.查找以及分隔等功能. awk字符串函数主要有:gsub.index.length.match.split.sub ...

  9. 【Android 系统开发】Android框架 与 源码结构

    一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...

  10. MacBook 最近发现的一些问题和技巧

    本猫的mba最近键盘莫名会失灵,但用鼠标切换其他用户时时好的,切换回来又不行,体现如下: 1.Spotlight里可以输入,其他不可以 2.cmd+tab可以切换进程 现在只有重启后才可以恢复. 网上 ...