一、概念
- JSON(JavaScript Object Notation),即JavaScript对象表示法,顾名思义,这里的JSON指的是类似于JS对象的一种数据格式,与JS对象不同的是,json字符串即json数据格式的属性名称和字符串值需要用双引号括起来
//JS对象
var oMan={
name:'tom',
age:16
}
//json字符串(json格式的数据)
{
"name":"tom",
"age":18
}
- 它是一种基于文本,独立于语言的轻量级数据交换格式
- 其本质是一种数据格式(语法格式见下文)
- JSON是JS的原生格式,是一种严格的JS对象的格式,即JSON的语法格式与JS中对象的语法格式相同,JSON使用JS语法来描述数据对象,因此在JS中解析执行JSON非常的方便
var person={fname:"Bill",lname:"Gates",age:56};
- 大多数编程语言都支持JSON数据格式的解析和处理,如在Java中可以将JSON格式的字符串进行解析,可以直接将上述JSON格式字符串解析成person对象,包含三个属性:fname,lname,age,属性值分别为Bill,Gates,56。(有点类似于正则表达式,获得了当今大部分语言的支持)
- JSON作为数据是目前网络中主流的数据传输格式之一,应用十分广泛,说是使用率达到99%一点也不勉强
- JSON 简单的语法格式和清晰的层次结构明显要比 XML 容易阅读,并且在数据交换方面,由于 JSON 所使用的字符要比 XML 少得多,可以大大得节约传输数据所占用得带宽。
二、语法
JSON有两种表示结构,对象和数组。
1.对象结构------以大括号开始,以大括号结束,中间部分包含键值对,键和值之间以冒号分隔,其中键是字符串,值可以是字符串,数值,true/false,null,对象或数组,不同键值对之间以逗号分隔开。
注意:键的名称必须有双引号,值如果是字符串,也必须是双引号。----若表示字符串,整体只能加单引号表示字符串
最后一个键值对后面不能加逗号
{"name":"zhangsan","pwd":123}
java中拼接json对象字符串:
2.数组结构------以方括号开始,以方括号结束,中间部分以逗号分隔的值列表组成
[{"uid":1,"uname":"aaa","pwd":"bbb"},{"uid":2,"uname":"张三","pwd":"aaa"}]
java中拼接json数组字符串:
三、JS中使用JSON
JSON是JS的原生格式,是一种严格的JS对象的格式,即JSON的语法格式与JS中对象的语法格式相同,因此在JS中解析执行JSON非常的方便,在JS中处理JSON数据不需要任何特殊的API 或者工具包。
JSON是JS中的一种数据格式,从属与JS,在JS中处理JSON数据可以直接调用其内置对象进行处理。
json字符串:符合json格式要求的js字符串。例如:var jsonStr = "{StudentID:'100',Name:'tmac',Hometown:'usa'}";
js对象:符合json格式要求的js对象。例如:var jsonObj = { StudentID: "100", Name: "tmac", Hometown: "usa" };
<script>
var obj ={};//这只是JS对象
var obj1={width:100,height:200}//JS对象
var obj2={'width':100,'height':100}//JS对象
var obj3={"width":100,"height":100,"name":"rose"}//JSON格式的JS对象
var obj4='{"width":100,"height":200,"name":"rose"}';/*我们可以把这个称做:JSON格式的字符串 */
var array=[
{"width":100,"height":200,"name":"rose"},
{"width":100,"height":200,"name":"rose"},
{"width":100,"height":200,"name":"rose"},
] /*这个叫JSON格式的数组,是JSON的稍复杂一点的形式 */
var arrayStr='['+
'{"width":100,"height":200,"name":"rose"},'+
'{"width":100,"height":200,"name":"rose"},'+
'{"width":100,"height":200,"name":"rose"},'+
']' ;/* 这个叫稍复杂一点的JSON格式的字符串 */
</script>
json字符串----->js对象
- 使用eval(String s)函数-----------eval()则可以解析任何字符串,eval是不安全的。
<script type="text/javascript">
var s='{"width":100,"height":200,"name":"rose"}'; //json字符串
var obj=eval("("+s+")"); //js对象
alert(obj.width); //通过js对象调用属性值
</script>
- 使用JSON.parse(String s)----------JSON.parse()方法可以解析json格式的数据,并且会对要解析的字符串进行格式检查,如果格式不正确则不进行解析。
<script type="text/javascript">
var s='{"width":100,"height":200,"name":"rose"}'; //json字符串
var obj=JSON.parse(s); //js对象
alert(obj.width); //通过js对象调用属性值
</script>
js对象--------->json字符串
- 使用JSON.stringify(jsObject obj)
<script type="text/javascript">
var s='{"width":100,"height":200,"name":"rose"}'; //json字符串
var obj=JSON.parse(s); //js对象
var ss=JSON.stringify(obj); //json字符串
alert(ss);
</script>
实例:JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 JavaScript 对象,然后在网页中使用该数据。为了更简单地为您讲解,我们使用字符串作为输入进行演示(而不是文件)。
//创建包含 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>
四、Java中使用JSON
Java中对JSON的解析可以使用第三方库,GSON是Google开发的Java API,用于Java对象和json字符串的转换。
其他第三库还有:FastJson(阿里巴巴),Jackson。
注意:需要导入GSON的jar包
package com.shangxuetang.java;
//创建person实体
public class Person {
private int id;
private String name;
private String address;
private int age;
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(int id, String name, String address, int age) {
super();
this.id = id;
this.name = name;
this.address = address;
this.age = age;
}
public Person() {
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", address=" + address
+ ", age=" + age + "]";
}
}
java对象------>json字符串
- 使用gson.toJson(Object obj)
package com.shangxuetang.java;
import com.google.gson.Gson; //导入Gson包
public class Test {
public static void main(String[] args) {
Person person= new Person(); //创建person对象
person.setId(1);
person.setName("marden");
person.setAddress("长沙");
person.setAge(25);
Gson gson=new Gson();
String str=gson.toJson(person); //将person对象转化为json字符串
System.out.println(str); //输出:{"id":1,"name":"marden","address":"长沙","age":25}
集合对象------>json字符串
- 使用gson.toJson(Object obj)
package com.shangxuetang.java;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
public class Test {
public static void main(String[] args) {
List list=new ArrayList();
Person person1=new Person();
person1.setId(1);
person1.setName("张三");
person1.setAddress("北京");
person1.setAge(19);
list.add(person1);
Person person2 = new Person();
person2.setId(2);
person2.setName("李四");
person2.setAddress("上海");
person2.setAddress("22");
list.add(person2);
Gson gson=new Gson();
String str=gson.toJson(list);
System.out.println(str); //结果:[{"id":1,"name":"张三","address":"北京","age":19},{"id":2,"name":"李四","address":"22","age":0}]
}
}
json字符串------>java对象
- 使用gson.fromJson()
package com.shangxuetang.java;
import com.google.gson.Gson; //导入Gson包
public class Test {
public static void main(String[] args) {
String string ="{'id':1,'name':'marden','address':'长沙','age':25}"; //json字符串
Gson gson=new Gson();
Person person=gson.fromJson(string, Person.class); //将json字符串转化为person对象
System.out.println(person); //结果:Person [id=1, name=marden, address=长沙, age=25]
}
}
json字符串------>集合对象
- 使用gson.fromJson()
package com.shangxuetang.java;
import java.awt.Window.Type;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class Test {
public static void main(String[] args) {
java.lang.reflect.Type type = new TypeToken<List<Person>>() {
}.getType();
Gson gson1=new Gson();
String str1="[{'id':1,'name':'张三','address':'北京','age':19},"
+ "{'id':2,'name':'李四','address':'上海','age':22}]";
List<Person> list1=gson1.fromJson(str1,type);
System.out.println(list1); //结果:[Person [id=1, name=张三, address=北京, age=19], Person [id=2, name=李四, address=上海, age=22]]
}
}
五、JSON在前后端数据交互中的应用
JSON本来是javascript里的内容,有时后端要传各种各样的数据格式来适应前端,所以需要用到json来转换,用它来表示各种各样复杂的数据,如对象,数组,集合,以及集合的集合等数据。
1.为什么用用json?
- 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小,其可读性也不错,基本具备了结构化数据的性质。
- 易于解析这种语言, 客户端JavaScript可以简单的通过eval()进行JSON数据的解析,通过遍历数组以及访问对象属性来获取数据,
- 因为JSON格式能够直接为服务器端代码使用, 大大简化了服务器端和客户端的代码开发量, 且易于维护,语言无关,任何语言都能轻松搞它,类型安全,值是有类型的,比如整数、字符串、布尔等。
2.json在前端(js)应用
后端将数据处理成json格式,前端就通过ajax来接收数据,并eval()或者json.prase(data)解析,循环遍历,展现在页面上。
$ .ajax({
url : "myfileAction",
dataType : "json",
type : "post",
success : function(data) {
}
});
第一步,接收数据
用ajax来接收后端发来的数据,简单说下ajax,ajax是一种用于快速创建动态网页的技术。通过在后台与服务器进行少量数据交换,ajax就可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。而传统的网页(不使用ajax)如果需要更新内容,必须重载整个网页面。
type: “POST”, //请求的方式,也有get请求
url: “myfileAction”, //请求地址,后台提供的,填写具体action,也就是struts.xml文件中action名字。
data: {name:name},//data是传给后台的json字段,后台需要哪些就传入哪些,这里是接收数据,所以可以不用写。
dataType: “json”, //json格式,后台返回的数据为json格式的。
第二步,解析数据
前后台传输的时候其实是字符串,解析是把json字符串重新变成json类型的对象。
json字符串转换成json对象
var obj = eval('(' + data + ')');
或者 var obj = JSON.parse(data);
区别:eval方法不会去检查给的字符串时候符合json的格式,同时如果给的字符串中存在js代码eval也会一并执行。相比而言eval()不安全,建议用JSON.parse。
json对象转为json字符串
var name = JSON.stringify(person);
前端传入后台的应该是一个json格式的字符串,而不是一个json对象,所以这个也有用的。
讲到这里简单提下发送数据吧。
<script type="text/javascript">
$(document).ready(function(){
var saveDataAry=[];
var data1={"userName":"zhangsan","address":"bj"};
var data2={"userName":"lisi","address":"nj"};
saveDataAry.push(data1);
saveDataAry.push(data2);
$.ajax({
type:"POST",
url:"user/saveUser",
dataType:"json",
contentType:"application/json",
data:JSON.stringify(saveData),
success:function(data){
}
});
});
</script>
ajax请求的时候也要指定dataType:“json”,contentType:”application/json” 这样就可以轻易的将一个对象或者List传到后端。
第三步,数据遍历
可以通过jQuery的$.each()方法遍历输出,举个例子
var arr = [{ name: "john", lang: "js" },{ name: "张三", lang: "ext" }];
$.each( arr, function(index, content)
{
alert( "the man's no. is: " + index + ",and " + content.name + " is learning " + content.lang );
});
如果声明的是字符串,var arr=’[]’这样类型,那么遍历的时候应该先用json.parse()或者jquery的方法$.parseJSON将字符串转化为对象。
还有一种是for循环遍历
for(var i=0; i<arr.length; i++)
{
alert(arr[i].name+" " + arr[i].value)
}
//取arr数组里一个叫name的值,比如上面name后面值是张三,就取出张三
3.json在后端上的应用
在后端action里要导入 net.sf.json.JSONObject这个包。
第一步,有几种后端数据封装成json数据格式
1.List集合转换成json代码
List list = new ArrayList();
list.add( “first” );
list.add( “second” );
JSONArray jsonArray = JSONArray.fromObject( list );
2. Map集合转换成json代码
Map map = new HashMap();
map.put(“name”, “json”);
map.put(“bool”, Boolean.TRUE);
map.put(“int”, new Integer(1));
map.put(“arr”, new String[] { “a”, “b” });
map.put(“func”, “function(i){ return this.arr[i]; }”);
JSONObject json = JSONObject.fromObject(map);
3.Bean转换成json代码
JSONObject jsonObject = JSONObject.fromObject(new JsonBean());
4. 数组转换成json代码
boolean[] boolArray = new boolean[] { true, false, true };
JSONArray jsonArray1 = JSONArray.fromObject(boolArray);
5. 一般数据转换成json代码
JSONArray jsonArray =JSONArray.fromObject([‘json’,’is’,’easy’]” );
6.用json put方法
JSONObject json=new JSONObject();
json.put(“name”, “张三”);
json.put(“age”, 18);
第二步,给你一个Struts 2的struts.xml中配置json类型result
<package name="json" extends="json-default" >
<action name="***Action"
class="action.UserAction" method="add">
<result type="json">
<param name="root">result</param>
</result>
</action>
</package>
<param> 这个标签是设置参数的,对于java程序来说,这个标签就相当于定义一个root 变量,将其赋值为map ,前台可以获取使用root这个参数值。
所以action里要有get,setresult方法,把json字符串值给reslut setResult(json.toString());
接收前端提交的数据
String data = request.getParameter("data");
JSONArray json=JSONArray.fromObject(data);
JSONObject jsonOne;
Map<String,String> map=null;
for(int i=0;i<json.size();i++){
updataMap = new HashMap<String,String>();
jsonOne = json.getJSONObject(i);
map.put("name", (String) jsonOne.get("name"));
map.put("age", (String) jsonOne.get("age"));
}
参考链接:https://blog.csdn.net/sinat_17775997/article/details/80667381