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[]["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的几种方式的更多相关文章
- unity解析json的两种方式
一直比较钟情于json,用来做数据交互,堪称完美!下面简单说一下unity使用C#脚本如何解析json数据吧. 一.写解析类,借助于JsonUtility.FromJson 直接给个例子吧 1.jso ...
- 解析JSON的三种方式
JSONObject JSONObject jsonObject = new JSONObject(strJson); JSONArray jsonArray = jsonObject.getJS ...
- 解析JSON有俩种方式:JSONObject和GSON
JSONObject: //JSONObject解析JSON文件 private void parseJSONWithJSONObject(String json_data) { try { JSON ...
- C#解析json的两种方式
C#中Json转换主要使用的几种方法! 这篇主要介绍2.4.第三种方法使用的比较局限,所以我没有深入学习. 第二种方法 我使用比较多的方式,这个方法是.NET内置的,使用起来比较方便 A.利用seri ...
- go 中解析JSON的三种姿势
背景 这是一篇写给0-1年新人的文章,短平快的教会你如何解析json字符串. 示例Json 假设有如下json字符串: { "userName":"admin" ...
- 解析JSON的两种方法eval()和JSON.parse()
解析JSON 一种方法是使用eval函数. var dataObj = eval("("+json+")"); 必须把文本包围在括号中,这样才能避免语法错误,迫 ...
- python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)
昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...
- Golang解析json的几种方法
Golang解析json的几种方法 概要 使用Golang调用其它平台API接口时总会被多层的json串给恶心到,我记录一下自己解析json的几种方法. 一.自带的json包 func JsonUnm ...
- JAVA解析XML的四种方式
java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...
随机推荐
- 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 ...
- 【shell脚本】mysql每日备份shell脚本
每天固定时间用mysqldump 备份mysql数据. #!/bin/bash #每天早上4点, mysql备份数据 orangleliu #chmod 700 backup.sh #crontab ...
- Android Studio科普篇——2.误区
1.删除一行是ctrl+x? 这是一个被谣传得很广泛的快捷键,但其实删除一行的快捷键不是ctrl+x,而是ctrl+y.ctrl+x在不选中内容的情况下,是剪切当前行,而ctrl+y才是删除当前行,它 ...
- Cocos2D中的纹理(textures)的解释
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- java设计模式---合成模式2
合成模式属于对象的结构模式,有时又叫做"部分--整体"模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式 ...
- 我眼中的Linux设备树(五 根节点)
五 根节点一个最简单的设备树必须包含根节点,cpus节点,memory节点.根节点的名字及全路径都是"/",至少需要包含model和compatible两个属性.model属性我们 ...
- Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)
前一段时间再次拜读<Inside the C++ Object Model> 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transfor ...
- awk字符串函数及其意义
awk字符串函数及其意义 awk提供了强大的内置字符串函数,用于实现文本的字符串替换.查找以及分隔等功能. awk字符串函数主要有:gsub.index.length.match.split.sub ...
- 【Android 系统开发】Android框架 与 源码结构
一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...
- MacBook 最近发现的一些问题和技巧
本猫的mba最近键盘莫名会失灵,但用鼠标切换其他用户时时好的,切换回来又不行,体现如下: 1.Spotlight里可以输入,其他不可以 2.cmd+tab可以切换进程 现在只有重启后才可以恢复. 网上 ...