JSON基础了解
JSON:JavaScript 对象表示法(JavaScript Object Notation)。
JSON 是存储和交换文本信息的语法。类似 XML。
JSON 比 XML 更小、更快,更易解析。
每一章中用到的实例
{
"employees": [ { "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName":"Thomas" , "lastName":"Carter" } ] }
这个 employee 对象是包含 3 个员工记录(对象)的数组。
什么是 JSON ?
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言 *
- JSON 具有自我描述性,更易理解
* JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
JSON – 转换为 JavaScript 对象
JSON 文本格式在语法上与创建 JavaScript 对象的代码相同。
由于这种相似性,无需解析器,JavaScript 程序能够使用内建的 eval() 函数,用 JSON 数据来生成原生的 JavaScript 对象。
亲自试一试 – 实例
通过我们的编辑器,您可以在线编辑 JavaScript 代码,然后通过点击一个按钮来查看结果:
<html>
<body> <h2>在 JavaScript 中创建 JSON 对象</h2><p> Name: <span id="jname"></span><br /> Age: <span id="jage"></span><br /> Address: <span id="jstreet"></span><br /> Phone: <span id="jphone"></span><br /> </p><script type="text/javascript">var JSONObject= { "name":"Bill Gates", "street":"Fifth Avenue New York 666", "age":56, "phone":"555 1234567"};
document.getElementById("jname").innerHTML=JSONObject.name document.getElementById("jage").innerHTML=JSONObject.age document.getElementById("jstreet").innerHTML=JSONObject.street document.getElementById("jphone").innerHTML=JSONObject.phone </script></body> </html>
亲自试一试
类似 XML
- JSON 是纯文本
- JSON 具有“自我描述性”(人类可读)
- JSON 具有层级结构(值中存在值)
- JSON 可通过 JavaScript 进行解析
- JSON 数据可使用 AJAX 进行传输
相比 XML 的不同之处
- 没有结束标签
- 更短
- 读写的速度更快
- 能够使用内建的 JavaScript eval() 方法进行解析
- 使用数组
- 不使用保留字
为什么使用 JSON?
对于 AJAX 应用程序来说,JSON 比 XML 更快更易使用:
使用 XML
- 读取 XML 文档
- 使用 XML DOM 来循环遍历文档
- 读取值并存储在变量中
使用 JSON
- 读取 JSON 字符串
- 用 eval() 处理 JSON 字符串
JSON 语法是 JavaScript 语法的子集。
JSON 语法规则
JSON 语法是 JavaScript 对象表示法语法的子集。
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON 名称/值对
JSON 数据的书写格式是:名称/值对。
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"firstName" : "John"
这很容易理解,等价于这条 JavaScript 语句:
firstName = "John"
JSON 值
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
JSON 对象
JSON 对象在花括号中书写:
对象可以包含多个名称/值对:
{ "firstName":"John" , "lastName":"Doe" }
这一点也容易理解,与这条 JavaScript 语句等价:
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,您可以创建一个对象数组,并像这样进行赋值:
例子
var employees = [
{ "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName":"Thomas" , "lastName": "Carter" } ];
可以像这样访问 JavaScript 对象数组中的第一项:
employees[0].lastName;
返回的内容是:
Gates
可以像这样修改数据:
employees[0].lastName = "Jobs";
亲自试一试
在下面的章节,您将学到如何把 JSON 文本转换为 JavaScript 对象。
JSON 文件
- JSON 文件的文件类型是 ".json"
- JSON 文本的 MIME 类型是 "application/json"
把 JSON 文本转换为 JavaScript 对象
JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 JavaScript 对象,然后在网页中使用该数据。
为了更简单地为您讲解,我们使用字符串作为输入进行演示(而不是文件)。
JSON 实例 – 来自字符串的对象
创建包含 JSON 语法的 JavaScript 字符串:
var txt = '{ "employees" : [' +
'{ "firstName":"Bill" , "lastName":"Gates" },' + '{ "firstName":"George" , "lastName":"Bush" },' + '{ "firstName":"Thomas" , "lastName":"Carter" } ]}';
由于 JSON 语法是 JavaScript 语法的子集,JavaScript 函数 eval() 可用于将 JSON 文本转换为 JavaScript 对象。
eval() 函数使用的是 JavaScript 编译器,可解析 JSON 文本,然后生成 JavaScript 对象。必须把文本包围在括号中,这样才能避免语法错误:
var obj = eval ("(" + txt + ")");
在网页中使用 JavaScript 对象:
例子
<p>
First Name: <span id="fname"></span><br /> Last Name: <span id="lname"></span><br /> </p><script type="text/javascript"> document.getElementById("fname").innerHTML = obj.employees[1].firstName document.getElementById("lname").innerHTML = obj.employees[1].lastName </script>
亲自试一试
JSON 解析器
提示:eval() 函数可编译并执行任何 JavaScript 代码。这隐藏了一个潜在的安全问题。
使用 JSON 解析器将 JSON 转换为 JavaScript 对象是更安全的做法。JSON 解析器只能识别 JSON 文本,而不会编译脚本。
在浏览器中,这提供了原生的 JSON 支持,而且 JSON 解析器的速度更快。
较新的浏览器和最新的 ECMAScript (JavaScript) 标准中均包含了原生的对 JSON 的支持。
Web 浏览器支持 |
Web 软件支持 |
---|---|
|
|
亲自试一试
对于较老的浏览器,可使用 JavaScript 库: https://github.com/douglascrockford/JSON-js
JSON 格式最初是由 Douglas Crockford 制定的。
jquery解析JSON数据的方法以及字符串转换成json的3种方法
用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明。
这里首先给出JSON字符串集,字符串集如下:
代码如下:
var data="
{
root:
[
{name:'1',value:'0'},
{name:'6101',value:'北京市'},
{name:'6102',value:'天津市'},
{name:'6103',value:'上海市'},
{name:'6104',value:'重庆市'},
{name:'6105',value:'渭南市'},
{name:'6106',value:'延安市'},
{name:'6107',value:'汉中市'},
{name:'6108',value:'榆林市'},
{name:'6109',value:'安康市'},
{name:'6110',value:'商洛市'}
]
}";
这里以jquery异步获取的数据类型——json对象和字符串为依据,分别介绍两种方式获取到的结果处理方式。
1.对于服务器返回的JSON字符串,如果jquery异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将该字符串放于eval()中执行一次。这种方式也适合以普通javascipt方式获取json对象,以下举例说明:
var dataObj=eval("("+data+")");//转换为json对象
alert(dataObj.root.length);//输出root的子对象数量
$.each(dataObj.root,fucntion(idx,item){
if(idx==0){
return true;
}
//输出每个root子对象的名称和值
alert("name:"+item.name+",value:"+item.value);
})
注:对于一般的js生成json对象,只需要将$.each()方法替换为for语句即可,其他不变。
2.对于服务器返回的JSON字符串,如果jquery异步请求将type(一般为这个配置属性)设为“json”,或者利用$.getJSON()方法获得服务器返回,那么就不需要eval()方法了,因为这时候得到的结果已经是json对象了,只需直接调用该对象即可,这里以$.getJSON方法为例说明数据处理方法:
$.getJSON("http://www.phpzixue.cn/",{param:"gaoyusi"},function(data){
//此处返回的data已经是json对象
//以下其他操作同第一种情况
$.each(data.root,function(idx,item){
if(idx==0){
return true;//同countinue,返回false同break
}
alert("name:"+item.name+",value:"+item.value);
});
});
这里特别需要注意的是方式1中的eval()方法是动态执行其中字符串(可能是js脚本)的,这样很容易会造成系统的安全问题。所以可以采用一些规避了 eval()的第三方客户端脚本库,比如JSON in JavaScript就提供了一个不超过3k的脚本库。
本文来自: IT知道网(http://www.itwis.com) 详细出处参考:http://www.itwis.com/html/programme/javascript/20090905/6081.html
=================字符串转换成json的三种方式=======================
第一种:eval方式解析
Js代码
- function strToJson(str){
- var json = eval('(' + str + ')');
- return json;
- }
第二种:new Function形式
Js代码
- function strToJson(str){
- var json = (new Function("return " + str))();
- return json;
- }
第三种:使用全局的JSON对象
Js代码
- function strToJson(str){
- return JSON.parse(str);
- }
另外:使用JSON.parse需严格遵守JSON规范,如属性都需用引号引起来,如下
Js代码
- var str = '{name:"jack"}';
- var obj = JSON.parse(str); // –> parse error
name没有用引号引起来,使用JSON.parse所有浏览器中均抛异常,解析失败。而前两种方式则没问题。
JSON数据前后台相互转换
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.google.gson.Gson;
import cn.itcast.beans.Person;
public class JsonTest {
public static void main(String[] args) {
/*
* 这是模拟当我们页面的ajax进行异步的时候,我们从数据库中找到一个对象或一个集合
* 然后把这个集合传递给页面,那么我们的页面接受到的就是一个json格式的字符粗或json数组格式的字符窜
* 然后我们在js中eval("("+传递过去的参数+")");这样我们就把一个对象转换成了一个页面的json的对象或json的数组
*/
List<Person> list = new ArrayList<Person>();
Person person = new Person(1,"张三");
Person person1 = new Person(2,"李四");
list.add(person);
list.add(person1);
//构建一个gson对象
Gson gson = new Gson();
//这是将一个对象转换成json格式的字符窜
String jsonPerson1 = gson.toJson(person);
//这是将一个集合转换成json格式的字符窜
String jsonPerson = gson.toJson(list);
System.out.println(jsonPerson1);
System.out.println(jsonPerson);
/*
* 这是模拟当我们的页面用ajax进行异步的时候,传递过来一个json或json数组格式的字符窜
* 那么我们在后台首先得把这个json或json数组格式的字符窜转换成一个javaBean对象或一个集合
* 下面就一个很好的演示
*/
String json = "{'studentId':2,'studentName':'曹欢'}";
//这是将一个字符窜的json编程一个java对象
Gson gson2 = new Gson();
Person person2 = gson2.fromJson(json, Person.class);
System.out.println(person2.getStudentId() + "—>" + person2.getStudentName());
System.out.println("===========================================================");
//这是将一个json数组格式的字符窜转换成一个集合–方式1
String json1 = "[{'studentId':2,'studentName':'曹欢'},{'studentId':3,'studentName':'文斌'}]";
List<Person> list2 = new ArrayList<Person>();
try {
JSONArray array = new JSONArray(json1);
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
Person person3 = new Person(object.getInt("studentId"),object.getString("studentName"));
list2.add(person3);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//这是打印出集合的数据
for (Person person3 : list2) {
System.out.println(person3.getStudentId()+"—->"+person3.getStudentName());
}
//这是将一个json数组格式的字符窜转换成一个集合–方式2
Type type = new TypeToken<List<Person>>(){}.getType();
Gson gson3 = new Gson();
List<Person> list = gson3.fromJson(json1, type);
}
}
Json转换利器Gson之实例一-简单对象转化和带泛型的List转化
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
jar和源码下载地址: http://code.google.com/p/google-gson/downloads/list
实体类:
public class Student {
private int id;
private String name;
private Date birthDay;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
@Override
public String toString() {
return "Student [birthDay=" + birthDay + ", id=" + id + ", name="
+ name + "]";
}
}
测试类:
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class GsonTest1 {
public static void main(String[] args) {
Gson gson = new Gson();
Student student1 = new Student();
student1.setId(1);
student1.setName("李坤");
student1.setBirthDay(new Date());
// //
System.out.println("———-简单对象之间的转化————-");
// 简单的bean转为json
String s1 = gson.toJson(student1);
System.out.println("简单Bean转化为Json===" + s1);
// json转为简单Bean
Student student = gson.fromJson(s1, Student.class);
System.out.println("Json转为简单Bean===" + student);
// 结果:
// 简单Bean转化为Json==={"id":1,"name":"李坤","birthDay":"Jun 22, 2012 8:27:52 AM"}
// Json转为简单Bean===Student [birthDay=Fri Jun 22 08:27:52 CST 2012, id=1,
// name=李坤]
// //
Student student2 = new Student();
student2.setId(2);
student2.setName("曹贵生");
student2.setBirthDay(new Date());
Student student3 = new Student();
student3.setId(3);
student3.setName("柳波");
student3.setBirthDay(new Date());
List<Student> list = new ArrayList<Student>();
list.add(student1);
list.add(student2);
list.add(student3);
System.out.println("———-带泛型的List之间的转化————-");
// 带泛型的list转化为json
String s2 = gson.toJson(list);
System.out.println("带泛型的list转化为json==" + s2);
// json转为带泛型的list
List<Student> retList = gson.fromJson(s2,
new TypeToken<List<Student>>() {
}.getType());
for (Student stu : retList) {
System.out.println(stu);
}
// 结果:
// 带泛型的list转化为json==[{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 8:28:52 AM"},{"id":2,"name":"曹贵生","birthDay":"Jun 22, 2012 8:28:52 AM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 8:28:52 AM"}]
// Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=1, name=李坤]
// Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=2, name=曹贵生]
// Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=3, name=柳波]
}
}
将一个json数组格式的字符串(包含字段和数组)转换成一个对象(里面包含字段和集合)
public class Address{
private int id;
private String name;
List<Student> studentList;
}
Address add1 = new Address();
add1.setId(1);
add1.setName("shenzhen");
Student student1 = new Student();
student1.setId(1);
student1.setName("李坤");
student1.setBirthDay(new Date());
studentList.add(student1);
add1.setStudentList(studentList);
//转字符串
String a1 = gson.toJson(add1);
System.out.println("转化为Json===" + a1);
//转对象
Address address1= gson.fromJson(a1, Address.class);
JQUERY AJAX请求在中JS封装JSON数组
比如:插入多条数据,并带有其它信息,这样就要求在JS组装成一JSON对象里面包含字段和集合(数组),如下所示:
var employee = {};
employee["id"] = 1;
employee["name"] = "zhansan";
var address =[{name:"shenzhen",telno:"13612345678"},
{name:"shanhai",telno:"13912345678"}];
employee["address"] = address;
var param = {};
//SON.stringif是把JSON对象转换为字符串
param["employeeInfoStr"] = JSON.stringif(employee);
下面AJAX请求如下:
$.ajax({
url: "employee.action",
type: "POST",
data: param,//{ Action: "getJson", TableName: $("#txt2").val() },
dataType: "json",
success: function (result) {
//成功后调用
},
error: function (ex) {
alert(ex);//失败后调用
}
});
ACTION中收到请求,当然在ACTION中有一个属性employeeInfoStr有GET/SET方法能自动收到AJAX请求过来的参数,用REQUEST.GEP方式来取传过来的参数也可以.
然后字符串解析成对象Employee.
public class Employee{
private int id;
private String name;
List<Address > address List;
}
public class Address{
private String name;
private String telno;
}
if(employeeInfoStr != null && !employeeInfoStr.isEmpty())
{
Gson gson = new Gson();
Employee employee= gson.fromJson(a1, Employee.class);
}