Java基础——JSON
一、JSON定义
在百度百科中的解释:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript的一个子集。 JSON采用完全独立于语言的文本格式,JSON简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构。
1、对象:
对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
2、数组:
数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是JavaScript很容易解释它。
以前学过的jquery 遍历 Dictionary 风格的数组(其实就是一个javascript对象)
var stu={ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }
$.each(stu,function(key,value){
alert(key+"---"+value);
}) var people =
{
"演员":
[
{ "firstName": "Brett", "lastName":"要被取值的", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
], "作者": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
], "配乐": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
] } //这里有3 个key,每个key对应的value 又是一个数组,数组中的每个元素,又是一个对象(对象由键值对组成)
//alert(people.演员[0].lastName) ; 可以取出 "要被取值的" 这个数组
//例子 用JSON 传输数据 //客户端
$(function(){
$("button").click(function(){
$.ajax({
url:"JSONTestServlet",
type:"post",
data:{userName:$("#userName").val()},
dataType:"JSON", //千万不要忘了指定返回数据的格式
success:function(user){
$("#divresult").append("用户id:"+user.id +"<br />");
$("#divresult").append("用户名:"+user.userName +"<br />");
$("#divresult").append("用户密码:"+user.password +"<br />");
$("#divresult").append("用户备注:"+user.note +"<br />");
}
});
});
}); //服务端
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //这里,要把 user转JSON格式的字符串返回
String str=" {\"id\":\"1\",\"userName\":\"张三\",\"password\":\"admin\" ,\"note\":\"这是备注\"} ";
response.setContentType("text/html;charset=utf-8");
response.getWriter().print(str);
}
二、JSONlib 的使用(两步)
1) 导入 JSON lib的包
commons-beanutils-1.8.2.jar
commons-collections-3.2.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
ezmorph-1.0.6.jar
JSON-lib-2.4-jdk15.jar
2) 使用
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName=request.getParameter("userName");
UserInfo user= UserDao.getUserByName(userName);
//使用JSONlib提供的功能,将一个类对象转成JSON格式的字符串
JSONObject JSONObj=JSONObject.fromObject(user);
System.out.println(JSONObj); response.setContentType("text/html;charset=utf-8");
response.getWriter().print(JSONObj.toString());
}
}
//例子,如何使用 JSONlib 返回一组数组
//服务端
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<UserInfo> userList=UserDao.getAllUser(); //如果要转一个对象, 用JSONObject,转多个对象(List),用 JSONArray
JSONArray JSONObj= JSONArray.fromObject(userList); response.setContentType("text/html;charset=utf-8" );
response.getWriter().print(JSONObj);
} //客户端
$(function(){
$("button").click(function(){
$.ajax({
url:"JSONArrayTestServlet",
type:"post",
dataType:"JSON",
success:function(userList){ //取出数据的第一种方式
/* for(var i=0;i<userList.length;i++){
alert(userList[i].id);
var trStr="<tr><td>"+userList[i].id+"</td><td>"+userList[i].userName+
"</td><td>"+userList[i].password+"</td><td>"+userList[i].note+"</td></tr>";
$("#table1").append(trStr);
} */ //使用 $.each() 的方式
$.each(userList,function(key,user){
var trStr="<tr><td>"+user.id+"</td><td>"+user.userName+
"</td><td>"+user.password+"</td><td>"+user.note+"</td></tr>";
$("#table1").append(trStr);
});
}
});
});
});
//例子 将JSON字符串反序列化为 java对象
String JSONStr= "{\"id\":99,\"userName\":\"张三\",\"password\":\"admin\",\"note\":\"备注\",\"aihao\":\"球类\"}" ;
JSONObject JSONObj=JSONObject.fromObject(JSONStr); //注意,UserInfo 类,一定要有一个无参的构造函数
UserInfo user=(UserInfo)JSONObject.toBean(JSONObj,UserInfo.class);
三、Ajax联动菜单
//请求发起页面
$(function(){
$("#bigCate").change(function(){
//取出自己的被选中的option 的 value (它应该是小分类对应的parentId)
var parentId=this.value ; //根据这个parentId去数据库查询,
$.ajax({
url:"CateAjaxServlet",
cache:false,
data:{parentId:parentId},
dataType:"JSON",
success:function(cateList){
//把取务端返回的小分类的列表,拼到小分类对应的下拉框中,但要先清空一下
$("#smallCate").empty();
$.each(cateList,function(key,cateInfo){
var optionStr="<option value='"+cateInfo.id+"'>"+cateInfo.cateName+"</option>";
$("#smallCate").append(optionStr);
}); }
});
});
}); <body>
<%
List<CateInfo> bigCateList=new CateDao().getCateList(0);
request.setAttribute("bigCateList", bigCateList);
%>
<form action="xxx" method="post">
大分类:
<select id="bigCate" name="bigCate" >
<c:forEach var="cateInfo" items="${ bigCateList}" >
<option value="${cateInfo.id }">${cateInfo.cateName }</option>
</c:forEach>
</select> 小分类:
<select id="smallCate" name="smallCate" >
</select> 打酱油的:
<input type="text" />
</form>
</body> //服务端
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//根据传上来的parentID 查询子分类
int parentId = Integer.parseInt(request.getParameter("parentId"));
List<CateInfo> cateList=new CateDao().getCateList(parentId);
JSONArray JSONObj=JSONArray.fromObject(cateList); response.setContentType("text/html;charset=utf-8" );
response.getWriter().print(JSONObj);
}
四、关于返回数据类型 为 JSONp 的情况
因为同源策略,Ajax 的请求是不许跨域访问的,如果试图访问其他服务器上的url 会出现如下错误
1.已阻止交叉源请求:同源策略不允许读取 http://10.10.10.15:8080/JSONPDemo/TestServlet 上的远程资源。
解决方法:可以将资源移动到相同的域名上或者启用 CORS 来解决这个问题。
2.已阻止跨源请求:同源策略禁止读取位于 http://169.254.246.250:8080/web1/WebAServlet 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')。
同源策略是指阻止代码获得或者更改从另一个域名下获得的文件或者信息。也就是说我们的请求地址必须和当前网站的地址相同。同源策略通过隔离来实现对资源的保护。这个策略的历史非常悠久从Netscape Navigator 2.0时代就开始了。
解决方法:解决这个限制的一个相对简单的办法就是在服务器端发送请求,服务器充当一个到达第三方资源的代理中继。虽然是用广泛但是这个方法却不够灵活。
另一个办法就是使用框架(frames),将第三方站点的资源包含进来,但是包含进来的资源同样要受到同源策略的限制。有一个很巧妙的办法就是在页面中使用动态代码元素,代码的源指向服务地址并在自己的代码中加载数据。当这些代码加载执行的时候,同源策略就不会起到限制。但是如果代码试图下载文件的时候执行还是会失败,幸运的是,我们可以使用JSON(JavaScript Object Notation)来改进这个应用。
//JSONp的使用
<script type="text/javascript">
$(function(){
$("button").click(function(){
$.ajax({
url:"http://169.254.246.250:8080/web1/WebAServlet",
dataType:"JSONp", //这里使用 JSONp这个格式
JSONp:"JSONpcallback", //这个名字是给别人用的
success:function(data){
$("#div1").append(data.id+"<br />");
$("#div1").append(data.userName+"<br />");
$("#div1").append(data.password+"<br />");
$("#div1").append(data.note+"<br />");
}
});
});
});
</script> //被访问者的服务端
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String JSONp=request.getParameter("JSONpcallback");
String JSONStr= "{\"id\":99,\"userName\":\"张三\",\"password\":\"admin\",\"note\":\"备注\",\"aihao\":\"球类\"}" ;
response.setContentType("text/html;charset=utf-8");
response.getWriter().print( JSONp+"("+ JSONStr +")" );
}
Java基础——JSON的更多相关文章
- Java基础-处理json字符串解析案例
Java基础-处理json字符串解析案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名开发人员,想必大家或多或少都有接触到XML文件,XML全称为“extensible ...
- 给Java新手的一些建议----Java知识点归纳(Java基础部分)
写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...
- 如何学习java?Java基础知识点分享
面对未知的行业,人们的第一反应应该是:拒绝踏入.因为学习真的是一个痛苦的过程.想要真正了解一个行业,熟知一个行业,并熟练掌握某一技术,是真的需要时间和精力的.在学习Java基础知识期间,千锋小编疯狂为 ...
- java处理json与对象的转化 递归
整个类是一个case,总结了我在使用java处理json的时候遇到的问题,还有级联关系的对象如何遍历,json和对象之间的转换! 对于对象json转换中遇到的问题我参考了一篇博客,http://blo ...
- 剑指Offer——知识点储备-Java基础
剑指Offer--知识点储备-Java基础 网址来源: http://www.nowcoder.com/discuss/5949?type=0&order=0&pos=4&pa ...
- Java JWT: JSON Web Token
Java JWT: JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand libr ...
- java基础-3
java基础-3 API Application Programming Interfaces --- 应用程序接口 Object 顶级父类 Bin --- 二进制 Oct --- 八进制 Dec ...
- Java基础96 ajax技术的使用
本文知识点(目录): 1.ajax的概念 2.使用ajax技术获取服务端的数据_实例 3.使用ajax技术检查用户名是否已存在_实例 4.使用ajax技术验证登录页面的用户名和密码_实例 ...
- Java基础组件快速入门
最近需要上线很多新的JAVA项目,然而很多JAVA的相关库都不太熟悉,项目实现起来遇到了不小阻力,熬了好几天夜.现在手头的工作基本完成了,因此打算好好来归纳下java的相关工具库,将来需要借助你们,好 ...
随机推荐
- leetcode(java)
86 class Solution { public ListNode partition(ListNode head, int x) { ListNode lowheader=new ListNod ...
- vuejs-devtools
先看看http://www.cnblogs.com/zhnaglei/p/7121482.html 这里的方法. 如果出现vue.js not detected之类的错误.试试用调试模式,就是用npm ...
- [算法专题] stack
1. Convert Expression to Reverse Polish Notation http://www.lintcode.com/en/problem/convert-expressi ...
- vscode调试angular
之前在Asp.net MVC + Angular1 的项目中,要调试前台代码都是用浏览器的开发者工具,使用正常,也没有感觉太大的不方便. 后来接触Angular2项目,因为它是要经过编译的,所以在浏览 ...
- react中使用阿里Viser图表
参考demo的codesandbox:https://codesandbox.io/s/kxxxx3w5kv 使用步骤: 1. 安装依赖 viser-react和@antv/data-set 2 ...
- jQuery基础与JavaScript与CSS交互-第五章
目录 JavaScript框架种类及其优缺点 jQuery库 jQuery对象$ 掌握基本选择器 掌握过滤选择器 掌握表单选择器 RIA技术 常见的RIA技术 Ajax Sliverlight Fle ...
- [Swift]扩展UIImage :获取图片指定像素的颜色值
对[UIImage]进行扩展 import UIKit extension UIImage{ /** 根据坐标获取图片中的像素颜色值 */ subscript (x: Int, y: Int) -&g ...
- 昕有灵犀-xyFS私有文件云存储OSS服务
本工程为本人开发的开源项目,地址: https://gitee.com/475660/xyFS 介绍: 一站式企业私有文件服务.针对软件开发时提供的文件存储系统,对文件上传.下载.分类.分组.审计.统 ...
- Python中的几种矩阵乘法(转)
一. np.dot() 1.同线性代数中矩阵乘法的定义.np.dot(A, B)表示: 对二维矩阵,计算真正意义上的矩阵乘积. 对于一维矩阵,计算两者的内积. 2.代码 [code] import ...
- hashcode和equals方法的区别和联系
说到 hashcode就要和Java中的集合,HashSet,HashMap 关系最为密切. 首先附录两张Java的集合结构图: 图二:(上图的简化版) 从Set集合的特点说起 & Set是如 ...