JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。JSON 是轻量级的文本数据交换格式
JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(JSP,PHP,.NET)编程语言都支持JSON.
JSON建构于两种结构-1
名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 在Java语言中,我们可以将它理解成HashMap.
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
示例:var json = {“name”:”Jack”,”age”:90,”Marray”:true};
JSON建构于两种结构-2
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array或List)。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
示例:var json = [“Jack”,”Rose”,”Tom”,89,true,false];
JSON的解析:
SON的解析分成两种情况:
将Object/Array解析成JSON字符串,这种情况一般用于响应用户的输出。
将Json串解析成Object或是Array,这种情况一般用于服务器接收到了用户请求的JSON串。
目前比较流行的解析工具为:
json-lib。
fastjson.
使用json-lib解析:
准备jar包: (可以从struts2的包中找到他们,因为struts2用它)
commons-beanutils.jar
commons-collections-3.1.jar
commons-lang-2.3.jar
commons-logging.jar
ezmorph-1.0.4.jar
json-lib-2.3-jdk15.jar-这是json-lib的核心包,上面都是它的依赖包
public class TestJson {
public static void main(String [] a){
//将array解析成json串
String[] str = {"Jack","Tom","90","true"};
JSONArray json = JSONArray.fromObject(str);
System.err.println(json);
//对像数组,注意数字和布而值
Object[] o = {"北京","上海",89,true,90.87};
json = JSONArray.fromObject(o);
System.err.println(json);
//使用集合类
List<String> list = new ArrayList<String>();
list.add("Jack");
list.add("Rose");
json = JSONArray.fromObject(list);
System.err.println(json);
//使用set集
Set<Object> set = new HashSet<Object>();
set.add("Hello");
set.add(true);
set.add(99);
json = JSONArray.fromObject(set);System.err.println(json);}}
使用JsonConfig过虑属性:适用于JavaBean
public static void main(String [] a){
JsonConfig jc = new JsonConfig();
//指定转换时,不包含那些属性
jc.setExcludes(new String[]{"name"});
Person p = new Person("A001","Tom");
JSONObject jo = JSONObject.fromObject(p,jc);
System.out.println(jo);
}
Person:
public class Person {
String id;
String name;
public String getId() {
return id;}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(String id, String name) {
super();
this.id = id;
this.name = name;
}
Json-lib:
将json串转换成Array:
public static void main(String [] a){
JSONArray json = JSONArray.fromObject("[\"西安智悦\",\"西安通瀛\",\"西安讯华\"]");
Object o= JSONArray.toArray(json);
System.err.println(o);
System.out.println(Arrays.asList((Object[])o));
}
复习XML文件:
XML一般是指可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
XML文件的优点:
1)XML文档内容和结构完全分离。
2)互操作性强。
3)规范统一。
4)支持多种编码。
5)可扩展性强。
scores.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students [
<!ELEMENT students (student+)>
<!ELEMENT student (name,course,score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
]>
<students>
<student id="11">
<name>张三</name>
<course>JavaSE</course>
<score>100</score>
</student>
<student id="22">
<name>李四</name>
<course>Oracle</course>
<score>98</score>
</student>
</students>
读取scores.xml
public class A{
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//0.获取scores.xml路径.scores.xml放在src目录下
//String filepath=A.class.getClassLoader().getResource("score.xml").getPath();
String filepath=Thread.currentThread().getContextClassLoader().getResource("scores.xml").getPath();
//1.创建DOM解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//2.由DOM解析器工厂创建DOM解析器
DocumentBuilder db = dbf.newDocumentBuilder();
//3.由DOM解析器解析文档,生成DOM树
Document doc = db.parse(filepath);
//4.解析DOM树,获取文档内容(元素 属性 文本)
//4.1获取根元素scores
NodeList scoresList = doc.getChildNodes();
Node scoresNode = scoresList.item(1);
System.out.println(scoresList.getLength());
//4.2获取scores中所有的子元素student
NodeList studentList = scoresNode.getChildNodes();
System.out.println(studentList.getLength());
//4.3对每个student进行处理
for(int i=0;i<studentList.getLength();i++){
Node stuNode = studentList.item(i);
//System.out.println(stuNode.getNodeType());
//输出元素的属性 id
if(stuNode.getNodeType()==Node.ELEMENT_NODE){
Element elem =(Element)stuNode;
String id= elem.getAttribute("id");
System.out.println("id------>"+id);
}
//输出元素的子元素 name course score
NodeList ncsList = stuNode.getChildNodes();
//System.out.println(ncsList.getLength() );
for(int j=0;j<ncsList.getLength();j++){
Node ncs = ncsList.item(j);
if(ncs.getNodeType() == Node.ELEMENT_NODE){
String name = ncs.getNodeName();
//String value = ncs.getFirstChild().getNodeValue();//文本是元素的子节点,所以要getFirstChild
String value = ncs.getTextContent();
System.out.println(name+"----->"+value);
} } } }}
与 XML 异同
与 XML 相同之处
JSON 是纯文本
JSON 具有"自我描述性"(程序员可读)
JSON 具有层级结构(值中存在值)
JSON 可通过 JavaScript 进行解析
JSON 数据可使用 AJAX 进行传输
与 XML 不同之处
没有结束标签
更短
读写的速度更快
能够使用内建的 JavaScript eval() 方法进行解析
使用数组
不使用保留字
XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。
用XML表示中国部分省市数据如下:
<?xml version="1.0" encoding="utf-8"?>
<country>
<name>中国</name>
<province>
<name>黑龙江</name>
<cities>
<city>哈尔滨</city> <city>大庆</city>
</cities>
</province>
<province>
<name>广东</name>
<cities>
<city>广州</city> <city>深圳</city> <city>珠海</city>
</cities>
</province>
</country>
用JSON表示如下:
{
"name": "中国",
"province": [{
"name": "黑龙江",
"cities": {
"city": ["哈尔滨", "大庆"]
}},
{
"name": "广东",
"cities": {
"city": ["广州", "深圳", "珠海"]
}}
]
}
JSON 的语法:
JSON 语法是 JavaScript 语法的子集。
数据在名称/值对中
数据由逗号分隔
大括号保存对象
中括号保存数组
JSON 名称/值对
JSON 数据的书写格式是:名称/值对。
名称/值对包括字段名称(在双引号中),后面写一个冒号, 然后是值:"firstName" : "John";
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Json练习</title>
</head>
<body>
<h2>JavaScript 创建 JSON 对象</h2>
<p>
网站名称: <span id="jname"></span><br />
网站地址: <span id="jurl"></span><br />
网站 slogan: <span id="jslogan"></span><br />
</p>
<script>
var JSONObject= {
"name":"西安通瀛",
"url":"www.51zhjob.com",
"slogan":"学的不仅是技术,更是梦想!"};
document.getElementById("jname").innerHTML=JSONObject.name
document.getElementById("jurl").innerHTML=JSONObject.url
document.getElementById("jslogan").innerHTML=JSONObject.slogan
</script>
</body>
</html>
JSON 值
JSON 值可以是:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组
对象
null
JSON 对象
JSON 对象在花括号中书写:
对象可以包含多个名称/值对:
{ "firstName":"John" , "lastName":"Doe" }
JSON 数组
JSON 数组在方括号中书写:
数组可包含多个对象:
{"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]}
在上面的例子中,对象 "employees" 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。
JSON 使用 JavaScript 语法
因为 JSON 使用 JavaScript 语法,所以无需额外的软件就能处理 JavaScript 中的 JSON。
通过 JavaScript,您可以创建一个对象数组,并像这样进行赋值:
例子:
<html>
<body>
<h2>通过 JSON 字符串来创建对象</h3>
<p>First Name: <span id="fname"></span></p>
<script type="text/javascript">
var employees = [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName": "Carter" }
];
employees[1].firstName="Jobs";
document.getElementById("fname").innerHTML=employees[1].firstName;
</script>
</body>
</html>
JSON 和 JS 对象互转
要实现从js对象转换为 JSON 字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'});
//结果是 '{"a": "Hello", "b": "World"}'
要实现从 JSON 转换为js对象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}');
//结果是 {a: 'Hello', b: 'World'}
web中用ajax传递json数据到后台
1.首先需要导入几个json的jar包;
commons-beanutils.jar
commons-collections-3.1.jar
commons-lang-2.3.jar
commons-logging.jar
ezmorph-1.0.4.jar
json-lib-2.3-jdk15.jar
2.写jsontest.jsp页面;
<script type="text/javascript" src="js/jquery-1.8.1.js"></script>
<script type="text/javascript">
function add() {
/**
当给个错误的url的时候,就会走到error方法里面,
该ajax请求会返回一个status code码,当返回值为200时,表示成功,执行success方法,否则执行error方法;
*/
/* $.ajax({
cache: true, type: "POST", url:"/Ajax/TestServlet", data:$('#form1').serialize(),// 你的formid
async: false, error: function(request) { alert("提交失败");
},
success: function(data) {
/* $("#commonLayout_appcreshi").parent().html(data);*/
/* alert(data);
$("#div1").text(data); } }); */
/** 采用json的方式进行数据传递 */
var jsonvalue = { "name" : "丫丫", "id" : 1, "password" : 123456 };
var jsonshuzu = { "name" : [ { "age" : 25, "height" : 160, "weight" : 100, "email" : "1946898935" }, { "age" : 26, "height" : 178, "weight" : 140, "email" : "1234567" } ], "address" : [ { "addressname" : "福州市"
}, { "addressname" : "厦门市" } ] }; alert("走到了add方法里面");
/**
dataType : "json":的意思是从后台返回的值必须为json格式,否则将执行error方法
*/
$.ajax({ cache : true, type : "post", url : "Ajax/TestServlet", data : { "ss" : JSON.stringify(jsonshuzu) }, async: false, error : function(request) { alert("提交失败");
}, success : function(data) { alert("data:" + data); $("#div1").text(data); } }); }</script>
</head>
<body>
<form id="form1">
<!-- 用户名:<input type="text" id="input1" name="username" id="yonghu"></input><br />
密码:<input type="password" name="password" id="mima"></input><br /> -->
<input type="button" name="提交" value="提交" οnclick="add()"></input>
<div id="div1"></div>
</form>
</body>
</html>
3.后台接受的代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
System.out.println("到了dopost方法中----------------------------");
PrintWriter out = response.getWriter();
/**
* 采用request.getParameter("username");获取从页面传来的值时,括号中的参数为页面中name的值
*/
/*String username=request.getParameter("username");
String passwrd=request.getParameter("password");
System.out.println(username+"/"+passwrd);
out.print(username+"/"+passwrd);*/
/**
* 接受从前端传递过来的json数据,要注意引入解析json的包
*/
String name=request.getParameter("ss");
JSONObject json=JSONObject.fromObject(name);
Iterator iter = json.keySet().iterator();
Map<String,String> map = new HashMap<String,String>();
/**
* 解析来自前端页面的值,解析json数组
*/
while (iter.hasNext()) {
String key = (String) iter.next();
String value = json.getString(key);
System.out.println("key:"+key+",value:"+value);
map.put(key, value);
}
String value=map.get("name");
JSONArray jsonArray =JSONArray.fromObject(value);
System.out.println("长度为:"+jsonArray.size());
for (int i = 0; i <jsonArray.size(); i++) {
int age=(Integer) jsonArray.getJSONObject(i).get("age");
int height= (Integer) jsonArray.getJSONObject(i).get("height");
int weight= (Integer) jsonArray.getJSONObject(i).get("weight");
String email=(String) jsonArray.getJSONObject(i).get("email");
System.out.println("获取到的值为:"+age+","+height+","+weight+","+email);
}
String values=map.get("address");
JSONArray jsonArray2=JSONArray.fromObject(values);
for (int i = 0; i <jsonArray2.size(); i++) {
String city=(String) jsonArray2.getJSONObject(i).get("addressname");
System.out.println("获取到的城市名为:"+city);
}
/**
* 前端页面设置了dataType为json格式,则后台返回时返回的格式必须为json格式
*/
out.print("提交成功");
out.flush();
out.close();
}