json 详解

以前只知道有json,并不知道能有什么用途,今天就仔细的了解了下……

浏览器从服务器端接收数据时,那些数据必须以浏览器能够理解的格式来发送,服务器端的编程语言只能以如下3种格式返回数据:xml、json、html
JSON:JavaScript 对象表示法(JavaScript Object Notation), 是存储和交换文本信息的语法。一种轻量级的数据交换格式,类似 XML,比 XML 更小、更快,更易解析。Json是javascript的原生格式,这意味着在javascript中处理json数据不需要任何特殊的api或工具包。
相比 XML 的不同之处:没有结束标签,更短,读写的速度更快,能够使用内建的 JavaScript eval() 方法进行解析,使用数组不使用保留字
为什么使用 JSON?
对于 AJAX 应用程序来说,JSON 比 XML 更快更易使用:
使用 XML、读取 XML 文档、使用 XML DOM 来循环遍历文档、读取值并存储在变量中
使用 JSON、读取 JSON 字符串、用 eval() 处理 JSON 字符串
Json规则很简单:
a.映射用冒号 “:” 表示,名称:值
b.并列的数据之间用逗号(,)分隔。名称1:值1,名称2:值2
c.映射的集合(对象)用大括号(“{}”)表示。{名称1:值1,名称2:值2}
d.并列数据的集合(数组)用方括号(”[]”)表示。
[
{名称1:值1,名称2:值2},
{名称1:值1,名称2:值2}
]
e. 元素值可具有的类型:string,number,object,array,true,false,null
Json只是一种文本字符串,被存储在responseText属性中,为了读取存储在responseText属性中的json数据,需要根据js中的eval函数把字符串当作它的参数,然后这个字符串会被当做js代码来执行,因为json的字符串就是由js代码构成的,所以它本身是可执行的,eval通过计算 string 得到的值(如果有的话)

下面是例子:

客户端:

	<body>
		<script type="text/javascript">
<%--
 
  // json表示形式如此强大,几乎可以满足任何常用服务器语言的需求
  //js表示一个对象用json
  var people={"name":"ljf","age":"20","email":"ljfbest@foxmail.com"};

  
  //多个对象
  var people1=[
               	{"name":"ljf","age":"20","email":"ljfbest@foxmail.com"},
               	{"name":"ljf1","age":"21","email":"ljfbest1@foxmail.com"}
              ]

  //混搭
  var peoples={"param1":
	  			[
	               	{"name":"ljf","age":"20","email":"ljfbest@foxmail.com"},
	               	{"name":"ljf1","age":"21","email":"ljfbest1@foxmail.com"}
              	],
              	"param2":
              	[
 	               	{"no":"123","class":"2"},
 	               	{"name":"ljf1","age":"21","email":"ljfbest1@foxmail.com"}
               	]  	
  			  }

  var information={
		  		  "name":"ljfbest",
		  		  "age":"20",
		  		  "tel":"155555555",
		  		  address:[
							  {"family":"shangqiu","code":"123333"},
							  {"company":"nyist","code":"1222333"}		
						  ]
		           }//名称不带引号也可以,此例中的address
  alert(information.address[0].family);
  
  --%>
  
  function ajaxFunction(){
	  var xmlHttp;
	  try{
		  xmlHttp=new XMLHttpRequest();
	  }catch(e){
		  try{
			  xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		  }catch(e){
			  try{
				  xmlHttp=new ActiveXObject("Microsoft.XMLHTTP")
			  }catch(e){}
		  }
	  }
	  return xmlHttp;
  }
  
  window.οnlοad=function(){
	    document.getElementById("ok").οnclick= function()//与服务器交互监听返回的数据状态   
        {  
	    	var xmlReq=ajaxFunction();
	    	xmlReq.onreadystatechange=function(){
	    		if(xmlReq.readyState==4){
	    			if(xmlReq.status==200||xmlReq.status==304)
	    				var data=xmlReq.responseText;
	    				alert(data);//此时服务器返回的只是字符串  "{pid:1,pname:'河南'}"
	    				var dataObj=eval("("+data+")");//此时被转化为json obj,注意要在两边加()
	    				alert(dataObj[1].pname);//dataObj: Object pid: 1 pname: "河南"
	    				for(var i=0;i<dataObj.length;i++)
	    					alert(dataObj[i].pname);
	    		}
	    	}
	        //post方法请求,服务器端用post接受,  
	        xmlReq.open("post","/test/JsonServlet?cache="+new Date(),true);  
	        xmlReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  
	        xmlReq.send(null);  
          }
    
  }
  </script>
		<select id="province" name="province">
			<option value="">
				请选择...
			</option>
		</select>

		<button id="ok">提交</button>
	</body>

服务器端:

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		/***********************************************************
		String str="{pid:1,pname:'河南'}";
		***********************************************************/
		String str="[{pid:1,pname:'商丘'},{pid:2,pname:'郑州'},{pid:3,pname:'安阳'}]";
		out.print(str);
	}

在java中经常牵扯到一系列对象,对象很多,要拼成一个json对象,很麻烦,下面的例子把province 写成一个类,用第三方类库json( http://json-lib.sourceforge.net/),需要用到的jar包: json-lib-2.4-jdk15.jar、commons-lang 2.5、 commons-beanutils 1.8.0、commons-collections 3.2.1、commons-logging 1.1.1、ezmorph 1.0.6

public class Province {
	private int id;
	private String pname;
	public Province(int id, String pname) {
		super();
		this.id = id;
		this.pname = pname;
	}
	//省略getter,setter……
}

public class JsonServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/******************************集合转化为json对象*********************/
		List<Province> list=new ArrayList<Province>();
		Province p1=new Province(1, "商丘");
		Province p2=new Province(2, "鄭州");
		Province p3=new Province(3, "安陽");
		list.add(p1);
		list.add(p2);
		list.add(p3);

		//JSONArray jsonArray=JSONArray.fromObject(list);//json_lib
		//System.out.println(jsonArray);//[{"id":1,"pname":"商丘"},{"id":1,"pname":"鄭州"},{"id":1,"pname":"安陽"}]
		
		//屏蔽掉某些不想要的属性
		JsonConfig config=new JsonConfig();
		config.setExcludes(new String[]{"id"});
		JSONArray jsonArray=JSONArray.fromObject(list,config);
		System.out.println(jsonArray);//[{"pname":"商丘"},{"pname":"鄭州"},{"pname":"安陽"}]
		
		/****************************对象转化为json对象*********************/
		Province p=new Province(4,"洛阳");
		JSONObject jsonObject=JSONObject.fromObject(p);
		System.out.println(jsonObject);
		
	}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值