Json的简单介绍

从结构上看,所有的数据最终都可以分成三种类型:
第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的词。
第二种类型是sequence(序列),也就是若干个相关的数据按照一定顺序并列在一起,又叫做array(数组)或List(列表),比如“北京,东京”。
第三种类型是mapping(映射),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作hash(散列)或dictionary(字典),比如“首都:北京”。

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它的规则非常简单并且是有趣的:
1) 并列的数据之间用逗号(“,”)分隔。
2) 映射用冒号(“:”)表示。
3) 并列数据的集合(数组)用方括号("[]")表示。
4) 映射的集合(对象)用大括号(“{}”)表示。
按照这个规则可以作以下理解:
1.数组用“[]”创建,对象用“{}”创建,并且使用Json基本都是用[]或者{}创建的数组或对象,否则一个普通的字符串是没有意义的;
2.无论是数组还是对象,之间的元素都用“,”隔开;
3.对象内部,(属性的)名称和值用“:”隔开,并且必须要用“:”隔开,不可单独存在属性名或者值;
4.对象和数组可以互相嵌套,即数组中的一个元素可以是一个对象也可以是一个数组,同理对象中的一个属性的值可以是一个对象也可以是一个数组。

例子:

<script language="javascript" type="text/javascript">
var china = {
beijing: {name: "北京", area: "16000", haidian: {name: "海淀区"}},
shanghai: {name: "上海", area: "10000", minhang: {name: "闵行区"}}
};
alert(china.beijing.name); //弹出北京
alert(china.shanghai.minhang.name); //弹出闵行区
</script>
<script language="javascript" type="text/javascript">
var ourcountry = [["北京市"], ["上海市"], ["合肥市", "芜湖市", "蚌埠市"]];
alert(ourcountry[2][1]); //弹出芜湖市
</script>
<script language="javascript" type="text/javascript">
var china = {
provinces: [
{
name: "北京",
cities: [{name: "北京市", quxian: ["海淀区", "朝阳区", "东城区", "西城区"]}]
},
{
name: "安徽省",
cities: [{name: "芜湖市", quxian: ["繁昌县", "芜湖县", "南陵县", "三山区"]},
{name: "合肥市",quxian: ["肥西县", "蜀山区", "庐阳区"]}]
},
"湖北省"
]
};
alert(china.provinces.length); //数组长度为3
alert(china.provinces[1].name) //安徽省
alert(china.provinces[1].cities[0].quxian[2]); //南陵县
alert(china.provinces[1].cities[1].name); //合肥市
alert(china.provinces[2]); //湖北省
</script>

Json在Ajax中的应用

客户端可以给服务器端通过地址栏或者post很容易的提交数据,但是服务器端处理完数据之后,将计算的结果信息回传给客户端时就存在了一定的难度,特别是 数据量较大时。这个时候数据的格式成了关键,按照某种格式可以很方便的进行数据的组装,然后可以很方便的进行解析。使用Json便是一种很好的策略。在服务器端,按照Json的格式拼装好一个字符串,响应给客户端。客户端如何进行解析呢?一般有两种策略(两种策略的名称是自己给的名字,不一定很合理,但是 思路应该是没有问题的):
1.直接解析
var json = eval('(' + result + ')');
通过上面这个表达式,就完成了将服务器端响应给客户端的Json格式的字符串解析成了一个Json(格式的)对象,名称为“json”,通过“json.”或者“json[]”的方式便可进行数据访问。

2.间接解析
var json = "r=" + result;
eval(json);
当然上面行代码可以合并为:eval("r=" + result);
通过上面的计算,也可以将服务器端响应给客户端的Json格式的字符串解析成了一个Json(格式的)对象,但是该对象名称为“r”,通过“r.”或者“r[]”的方式可进行数据访问。
总结:Json是一种简单的数据交换格式,它几乎可以很好的代替xml让服务器之间灵活的交换数据。

JavaScript中的数组和对象

在JavaScript中,通常用[]创建的数据格式称为数组,用{}创建的东西称为对象。
有一个数组a=[1,2,3,4],还有一个对象a={0:1,1:2,2:3,3:4},运行alert(a[1]),两种情况下的运行结果是相同的!这就是说,数据集合既可以用数组表示,也可以用对象表示,那么到底该用哪一种呢?
其实数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。
当然,数组和对象的另一个区别是,数组中的数据没有“名称”(name),对象中的数据有“名称”(name)。但是问题是,很多编程语言中,都有一种叫
做“关联数组“(associativearray)的东西。这种数组中的数据是有名称的。

比如在javascript中,可以这样定义一个对象:

var a={"城市":"北京","面积":16800,"人口":1600}; 

但是,也可以定义成一个关联数组:

var a = new Array();
a["城市"]="北京";
a["面积"]=16800;
a["人口"]=1600;

这样一来好像数组和集合就没有区别了,其实不是,在Javascript语言中,关联数组就是对象,对象就是关联数组。通过第二种方式创建的数组和通过 []方式创建的数组是有很大的区别的,在第二个方式创建的“数组”中,也可以和第一种方式类似,通过“a.城市”来得到“北京”,“a.人口”来得到 “1600”,但是它和第一种方式创建的对象又是有区别的,通过第一种方式定义的a是没有length属性的,二通过第二种方式定义的a有,可是值为0, 可见里面的差别还是有的,要想具体搞清楚,恐怕得看看底层的一些实现代码了。

我们经常会在服务器端返回 json 格式的值,这样可以直接在脚本中当作完整的对象来使用,但是,许多新手通常都会遇到一个错误提示: Invalid Label ,这个问题通常会让人苦恼不堪,因为明明正确的 json 格式,却提示错误。

这时会提示 :Error: Invalid Label
实际上,我们的 json 格式并没有错误,只是在 eval 的时候,要把你的 json 值用 "()" 括号括起来:

var result = eval("(" + o.responseText + ")");

在PHP中应用

$str = 'test';
$arr1 = array("zhangsan", 30);
$arr2 = array('name' =>'zhangsan', 'age' => 30);
$arr3 = array(array("name" => "zhangsna", 'age' => 30), array('name' => 'lisi', 'age' => 25));
$arr4 = array(
'p1' => array("name" => "zhangsna", 'age' => 30),
'p2' => array('name' => 'lisi', 'age' => 25)
);
/*
echo $str;
echo json_encode($arr1);
echo json_encode($arr2);
echo json_encode($arr3);
echo json_encode($arr4);
*/
/*
test
["zhangsan",30]
{"name":"zhangsan","age":30}
[{"name":"zhangsna","age":30},{"name":"lisi","age":25}]
{"p1":{"name":"zhangsna","age":30},"p2":{"name":"lisi","age":25}}
*/
<script language="javascript" type="text/javascript">
$.ajax({
url: "test.php",
type: 'post',
dataType: 'json',
success: function (msg) {
//$str. alert(JSON.stringify(msg)); 弹出test
//$arr1. alert(JSON.stringify(msg[0])); 弹出zhangsan
//$arr2. alert(JSON.stringify(msg.name)); 弹出zhangsan
//$arr3. alert(JSON.stringify(msg[1].name)); 弹出lisi
//$arr4. alert(JSON.stringify(msg.p1.name); 弹出zhangsan
}
});
</script>

jquery 对 Json 的各种遍历

在JSON中,有两种结构:对象和数组。

1.对象

一个对象以“{”开始,“}”结束。每个“key”后跟一“:”,“‘key/value’ 对”之间运用 “,”分隔。

packJson = {"name":"caibaojian.com", "password":"111"}

2.数组

packJson = [{"name":"caibaojian.com", "password":"111"}, {"name":"tony", "password":"111"}];

数组是值的有序集合。一个数组以“[”开始,“]”结束。值之间运用 “,”分隔。

JSON对象和JSON字符串的转换

在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键。例如:

JSON字符串:

var jsonStr = '{"name":"caibaojian", "password":"1111"}';

JSON对象:

var jsonObj = {"name":"caibaojian.com", "password":"1111"};

1、String转换为Json对象

var jsonObj = eval('(' + jsonStr + ')');

2.Json对象转换为String字符串

var jsonStr = jsonObj.toJSONString();

each

<script type="text/javascript">
$().ready(
function () {
var anObject = {one: 1, two: 2, three: 3};//对json数组each
$.each(anObject, function (name, value) {
//one 1,two 2,three 3
document.write(name + ' ' + value);
});
var anArray = ['one', 'two', 'three'];
$.each(anArray, function (n, value) {
//0 one,1 two,2 three
document.write(n + ' ' + value);
}
);
}
);
</script>

原生js遍历json对象

无规律

<script>
var json = [{name: 'zhangsan', age: 45}, {acco: 'lisiaaa', sex: 'famale'}];
var len = json.length;
for (var i = 0; i < len; i++) {
for (var key in json[i]) {
alert(key + ':' + json[i][key]);
}
}
</script>

有规律

<script>
packJson = [{"name": "nikita", "password": "1111"},
{"name": "tony", "password": "2222"}]; for (var p in packJson) {
//遍历json数组时,这么写p为索引,0,1
alert(packJson[p].name + " " + packJson[p].password);
}
//也可以用这种方式
for(var i = 0; i < packJson.length; i++){
alert(packJson[i].name + " " + packJson[i].password);
}
</script>
<script>
myJson = {"name":"caibaojian", "password":"1111"};
for(var p in myJson){
//遍历json对象的每个key/value对,p为key
alert(p + " " + myJson[p]);
}
</script>

Json数组对象和对象数组的更多相关文章

  1. JSON 格式的转换: 数组、字符串、List集合、DataTable,实体对象

    JSON验证工具:http://jsonlint.com/JSON简明教程:http://www.w3school.com.cn/json/Newtonsoft.Json类库下载:http://jso ...

  2. json数组对象和对象数组(转)

    转自:http://www.cnblogs.com/zhangji/archive/2011/09/02/2163811.html 一.Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型 ...

  3. 转 json数组对象和对象数组

    一.Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的词. 第 ...

  4. 用JAVA进行Json数据解析(对象数组的相互嵌套)

    这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下! 假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相 ...

  5. JSON语法、对象、遍历数组的区别和基本操作

    JSON 语法规则 JSON 语法是 javascript 对象表示语法的子集. 数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称/值对 JSON 数据的书写格式是: ...

  6. JS中彻底删除json对象组成的数组中的元素

    只是分享一个小知识~ 在JS中,对于某个由json对象组成的数组,例如: var test = [{ "a": "1", "b": &quo ...

  7. json数组对象和对象数组 ---OK

    一.Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的词. 第 ...

  8. C# json反序列化 对象中嵌套数组 (转载) 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

    C# json反序列化 对象中嵌套数组 (转载)   看图: 这里可以看到是二层嵌套!!使用C#如何实现?? 思路:使用list集合实现 → 建立类 → list集合 → 微软的   Newtonso ...

  9. Java基础/利用fastjson反序列化json为对象和对象数组

    利用fastjson反序列化json为对象和对象数组 利用 fastjosn 将 .json文件 反序列化为 java.class 和 java.util.List fastjson 是一个性能很好的 ...

随机推荐

  1. windows linux 使用python执行系统命令并将结果保存到变量

    最近需要用到os.system 发现不能赋值到变量 后查有更新的模块,如下: os.system os.spawn* os.popen* popen2.* commands.* 重新使用content ...

  2. 解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题

    刚装好SSMS 17.1准备体验,弹出: 一番搜索,普遍办法都是安装VS2015独立shell.删除某个注册表项什么的,没用,首先这个shell我是装了的,然后也没有那个注册表项.我自己尝试过重装sh ...

  3. 基于http的多进程并发文件服务器

    1 可以掌握的知识点 (1) 线上部署时的守护应用 (2) 常规的文件操作,配置文件读取 (3) 网络编程,端口复用等文件 (4) 多进程知识 2 代码注释如下 test_httpd.h #inclu ...

  4. 9.CVE-2016-5195(脏牛)内核提权漏洞分析

    漏洞描述: 漏洞编号:CVE-2016-5195 漏洞名称:脏牛(Dirty COW) 漏洞危害:低权限用户利用该漏洞技术可以在全版本Linux系统上实现本地提权 影响范围:Linux内核>=2 ...

  5. Linux的.run文件简单制作

    run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示: |-----------------|| || 安装脚本 || ||-----------------|| || 程序 || ||-- ...

  6. BOX (UVA-1587) 比较代码书写上的差距

    对比一下代码的书写差距: 我的代码: #include<iostream> using namespace std; ]; ]; ]; //访问标记 bool judge(int i, i ...

  7. C#----接口与抽象类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 接口 { ...

  8. System.Threading.Thread的使用及传递参数等总结

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  9. C#监听窗体新建/鼠标移入移出

    在新建window窗体时会激活方法,并循环所有窗体,鼠标移动在重写方法的页面中也会激活 winform直接在继承了From窗体cs中 protected override void WndProc(r ...

  10. One-Hot独热编码

    One-Hot独热编码 Dummy Encoding VS One-Hot Encoding二者都可以对Categorical Variable做处理,定性特征转换为定量特征,转换为定量特征其实就是将 ...