JSON详解

阅读目录 JSON的两种结构 认识JSON字符串 在JS中如何使用JSON 在.NET中如何使用JSON 总结

JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式,为什么没有选择XML呢?因为XML虽然可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们更倾向于选择JSON来交换数据。这篇文章主要从以下几个方面来说明JSON。

1,JSON的两种结构 2,认识JSON字符串 3,在JS中如何使用JSON 4,在.NET中如何使用JSON 5,总结

回到顶部

JSON的两种结构

JSON有两种表示结构,对象和数组。 对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。

{     key1:value1,     key2:value2,     ... }

其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组

数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。

[     {         key1:value1,         key2:value2     },     {          key3:value3,          key4:value4       } ]

回到顶部

认识JSON字符串

之前我一直有个困惑,分不清普通字符串,json字符串和json对象的区别。经过一番研究终于给弄明白了。比如在js中。

字符串:这个很好解释,指使用“”双引号或’’单引号包括的字符。例如:var comStr = 'this is string';

json字符串:指的是符合json格式要求的js字符串。例如:var jsonStr = "{StudentID:'100',Name:'tmac',Hometown:'usa'}";

json对象:指符合json格式要求的js对象。例如:var jsonObj = { StudentID: "100", Name: "tmac", Hometown: "usa" };

回到顶部

在JS中如何使用JSON

JSON是JS的一个子集,所以可以在JS中轻松地读,写JSON。读和写JSON都有两种方法,分别是利用”.”操作符和“[key]”的方式。 我们首先定义一个JSON对象,代码如下。

var obj = {             1: "value1",

"2": "value2",

count: 3,

person: [ //数组结构JSON对象,可以嵌套使用

{                             id: 1,                             name: "张三"                         },

{                             id: 2,                             name: "李四"                         }                    ],

object: { //对象结构JSON对象                 id: 1,                 msg: "对象里的对象"                }         };

1,从JSON中读数据

function ReadJSON() {

alert(obj.1); //会报语法错误,可以用alert(obj["1"]);说明数字最好不要做关键字

alert(obj.2); //同上

alert(obj.person[0].name); //或者alert(obj.person[0]["name"])

alert(obj.object.msg); //或者alert(obj.object["msg"])         }

2,向JSON中写数据

比如要往JSON中增加一条数据,代码如下:

function Add() {             //往JSON对象中增加了一条记录             obj.sex= "男" //或者obj["sex"]="男"         }

增加数据后的JSON对象如图:

3,修改JSON中的数据

我们现在要修改JSON中count的值,代码如下:

function Update() {             obj.count = 10; //或obj["count"]=10         }

修改后的JSON如图。

4,删除JSON中的数据

我们现在实现从JSON中删除count这条数据,代码如下:

function Delete() {             delete obj.count;         }

删除后的JSON如图

可以看到count已经从JSON对象中被删除了。

5,遍历JSON对象

可以使用for…in…循环来遍历JSON对象中的数据,比如我们要遍历输出obj对象的值,代码如下:

function Traversal() {             for (var c in obj) {                 console.log(c + ":", obj[c]);             }         }

程序输出结果为:

回到顶部

在.NET中如何使用JSON

说到在.net中使用JSON,就不得不提到JSON.NET,它是一个非常著名的在.net中处理JSON的工具,我们最常用的是下面两个功能。

1,通过序列化将.net对象转换为JSON字符串

在web开发过程中,我们经常需要将从数据库中查询到的数据(一般为一个集合,列表或数组等)转换为JSON格式字符串传回客户端,这就需要进行序列化,这里用到的是JsonConvert对象的SerializeObject方法。其语法格式为:JsonConvert.SerializeObject(object),代码中的”object”就是要序列化的.net对象,序列化后返回的是json字符串。

比如,现在我们有一个TStudent的学生表,表中的字段和已有数据如图所示

从表中我们可以看到一共有五条数据,现在我们要从数据库中取出这些数据,然后利用JSON.NET的JsonConvert对象序列化它们为json字符串,并显示在页面上。C#代码如下

protected void Page_Load(object sender, EventArgs e)         {             using (L2SDBDataContext db = new L2SDBDataContext())             {                 List<Student> studentList = new List<Student>();                 var query = from s in db.TStudents                             select new {                                 StudentID=s.StudentID,                                 Name=s.Name,                                 Hometown=s.Hometown,                                 Gender=s.Gender,                                 Brithday=s.Birthday,                                 ClassID=s.ClassID,                                 Weight=s.Weight,                                 Height=s.Height,                                 Desc=s.Desc                             };                 foreach (var item in query)                 {                     Student student = new Student { StudentID=item.StudentID,Name=item.Name,Hometown=item.Hometown,Gender=item.Gender,Brithday=item.Brithday,ClassID=item.ClassID,Weight=item.Weight,Height=item.Height,Desc=item.Desc};                     studentList.Add(student);                 }                 lbMsg.InnerText = JsonConvert.SerializeObject(studentList);             }         }

输出结果

从图中我们可以看到,数据库中的5条记录全部取出来并转化为json字符串了。

2,使用LINQ to JSON定制JSON数据

使用JsonConvert对象的SerializeObject只是简单地将一个list或集合转换为json字符串。但是,有的时候我们的前端框架比如ExtJs对服务端返回的数据格式是有一定要求的,比如下面的数据格式,这时就需要用到JSON.NET的LINQ to JSON,LINQ to JSON的作用就是根据需要的格式来定制json数据。

比如经常用在分页的json格式如代码:

{     "total": 5, //记录总数     "rows":[         //json格式的数据列表     ] }

使用LINQ to JSON前,需要引用Newtonsoft.Json的dll和using Newtonsoft.Json.Linq的命名空间。LINQ to JSON主要使用到JObject, JArray, JProperty和JValue这四个对象,JObject用来生成一个JSON对象,简单来说就是生成”{}”,JArray用来生成一个JSON数组,也就是”[]”,JProperty用来生成一个JSON数据,格式为key/value的值,而JValue则直接生成一个JSON值。下面我们就用LINQ to JSON返回上面分页格式的数据。代码如下:

protected void Page_Load(object sender, EventArgs e)         {             using (L2SDBDataContext db = new L2SDBDataContext())             {                 //从数据库中取出数据并放到列表list中                 List<Student> studentList = new List<Student>();                 var query = from s in db.TStudents                             select new                             {                                 StudentID = s.StudentID,                                 Name = s.Name,                                 Hometown = s.Hometown,                                 Gender = s.Gender,                                 Brithday = s.Birthday,                                 ClassID = s.ClassID,                                 Weight = s.Weight,                                 Height = s.Height,                                 Desc = s.Desc                             };                 foreach (var item in query)                 {                     Student student = new Student { StudentID = item.StudentID, Name = item.Name, Hometown = item.Hometown, Gender = item.Gender, Brithday = item.Brithday, ClassID = item.ClassID, Weight = item.Weight, Height = item.Height, Desc = item.Desc };                     studentList.Add(student);                 }

//基于创建的list使用LINQ to JSON创建期望格式的JSON数据                 lbMsg.InnerText = new JObject(                         new JProperty("total",studentList.Count),                         new JProperty("rows",                                 new JArray(                                         //使用LINQ to JSON可直接在select语句中生成JSON数据对象,无须其它转换过程                                         from p in studentList                                         select new JObject(                                                 new JProperty("studentID",p.StudentID),                                                 new JProperty("name",p.Name),                                                 new JProperty("homeTown",p.Hometown)                                             )                                     )                             )                     ).ToString();             }         }

输出结果为:

3,处理客户端提交的JSON数据

客户端提交过来的数据一般都是json字符串,有了更好地进行操作(面向对象的方式),所以我们一般都会想办法将json字符串转换为json对象。例如客户端提交了以下数组格式json字符串。

[     {StudentID:"100",Name:"aaa",Hometown:"china"},     {StudentID:"101",Name:"bbb",Hometown:"us"},     {StudentID:"102",Name:"ccc",Hometown:"england"} ]

在服务端就可以使用JObject或JArray的Parse方法轻松地将json字符串转换为json对象,然后通过对象的方式提取数据。下面是服务端代码。

protected void Page_Load(object sender, EventArgs e)         {             string inputJsonString = @"                 [                     {StudentID:'100',Name:'aaa',Hometown:'china'},                     {StudentID:'101',Name:'bbb',Hometown:'us'},                     {StudentID:'102',Name:'ccc',Hometown:'england'}                 ]";             JArray jsonObj = JArray.Parse(inputJsonString);             string message = @"<table border='1'>                     <tr><td width='80'>StudentID</td><td width='100'>Name</td><td width='100'>Hometown</td></tr>";             string tpl = "<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>";             foreach (JObject jObject in jsonObj)             {                 message += String.Format(tpl, jObject["StudentID"], jObject["Name"],jObject["Hometown"]);             }             message += "</table>";             lbMsg.InnerHtml = message;         }

输出结果:

当然,服务端除了使用LINQ to JSON来转换json字符串外,也可以使用JsonConvert的DeserializeObject方法。如下面代码实现上面同样的功能。

List<Student> studentList = JsonConvert.DeserializeObject<List<Student>>(inputJsonString);//注意这里必须为List<Student>类型,因为客户端提交的是一个数组json             foreach (Student student in studentList)             {                 message += String.Format(tpl, student.StudentID, student.Name,student.Hometown);             }

回到顶部

总结

在客户端,读写json对象可以使用”.”操作符或”["key”]”,json字符串转换为json对象使用eval()函数。 在服务端,由.net对象转换json字符串优先使用JsonConvert对象的SerializeObject方法,定制输出json字符串使用LINQ to JSON。由json字符串转换为.net对象优先使用JsonConvert对象的DeserializeObject方法,然后也可以使用LINQ to JSON。

Json 讲解的更多相关文章

  1. JSON讲解和“弹窗”

    json定义形式{key1:value1, key2:value2, key3:value3.....} 例: title>JSON讲解</title> <script src ...

  2. 数据格式json讲解

    JSON 在使用名称/值对或XML时,实际上是使用javascript从应用程序中取得数据并将数据转换成另一种数据格式.javascript不仅作为格式化语言使用,还可以使用javascript语言中 ...

  3. SpringMVC: JSON

    SpringMVC:JSON讲解 什么是JSON? JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛. 采用完全独立于编 ...

  4. 阿里巴巴Json工具-Fastjson讲解

    Fastjson是阿里巴巴公司开源的速度最快的Json和对象转换工具,一个Java语言编写的JSON处理器. 1.遵循http://json.org标准,为其官方网站收录的参考实现之一.2.功能qia ...

  5. JavaScript---网络编程(5)-自定义对象Json、Dom模型概念讲解

    这节博客主要讲解Dom模型概念~和JSON的简单介绍 首先,还是先上out.js的代码: function println(param){ document.write(param+"< ...

  6. JSON.stringify 语法实例讲解+easyui data-options属性+expires【申明:来源于网络】

    JSON.stringify 语法实例讲解+easyui data-options属性+expires[申明:来源于网络] JSON.stringify 语法实例讲解:http://www.jb51. ...

  7. (转)使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解

    使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解   本文用代码简单介绍cjson的使用方法,1)创建json,从json中获取数据.2)创建json数组和解析json数组 1. 创 ...

  8. json、pickle\shelve模块(超级好用~!)讲解

    json.pickle模块讲解 见我前面的文章:http://www.cnblogs.com/itfat/p/7456054.html shelve模块讲解(超级好用~!) json和pickle的模 ...

  9. 2.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:

    转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 个人认为,使用@ResponseBody方式来实现json数据的返回比较方便,推荐使用. 摘要 ...

随机推荐

  1. 【LeetCode】#344 Reverse String

    [Question] Write a function that takes a string as input and returns the string reversed. Example: G ...

  2. ERROR [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名

    连接excel odbc时发生如下问题: 是因为数据源(odbc)没有配置excel 驱动:控制面板->管理工具->数据源(ODBC): 添加: 如无效果,则可能是位数引起的,比如系统是6 ...

  3. html中offsetTop、clientTop、scrollTop、offsetTop各属性介绍

    例如:$('window').scrollTop()获取的就是当前这个页面超出窗口最上端的高度,scrollLeft与此同理 scrollHeight: 获取对象的滚动高度. scrollLeft:该 ...

  4. 初始通过 FastClick.notNeeded 方法判断是否需要做后续相关处理

    其实前面几篇文章大家都遇到一些错误,很多时候呢,我并没有直接回复解决方案,不是LZ不想告诉大家,如果不想那就不写这个了,估计博客园啊CSDN啊那么多写博客的,很少有人把现用框架分享出来,既然分享就毫不 ...

  5. img标签 加载FTP的图片 C#

    好吧,我是菜鸟,这是我今天遇到的问题,什么也不会,得高人指点 1.使用FtpWebRequest下载图片,以流存贮 2.在ashx文件里面直接已流方式(HttpContext.Current.Resp ...

  6. MVC5+EF6 入门完整教程四

    上篇文章主要讲了如何配置EF, 我们回顾下主要过程: 创建Data Model à 创建Database Context à创建databaseInitializerà配置entityFramewor ...

  7. NoSQL生态系统——类似Bigtable列存储,或者Dynamo的key存储(kv存储如BDB,结构化存储如redis,文档存储如mongoDB)

    摘自:http://www.ituring.com.cn/article/4002# NoSQL系统的数据操作接口应该是非SQL类型的.但在NoSQL社区,NoSQL被赋予了更具有包容性的含义,其意为 ...

  8. Leetcode 详解(ReverseWords)

    Leetcode里面关于字符串的一些问题,描述如下: Given an input string, reverse the string word by word. For example,Given ...

  9. USE INSTAVPN TO DESPLOY VPN server IN amazon EC2

    Requirements Ubuntu 14.04 512 MB RAM Install curl -sS https://raw.githubusercontent.com/sockeye44/in ...

  10. daydayup1 codeforces141c

    题意:给定n个数字,代表每个人前面有几个人比他高,让你构造一个height数组,满足条件 思路:直接贪心就好,假设到第i个人,设他的高度为i-a[i]+1,前面比他高的人每个人的高度加1