JSON详解

一、概念

  • 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值