8.1 简单json输出
json是一种字符串序列,它遵循“键:值”这样的格式,现在已经成为了一种通用的数据传输格式,下面就是一个json字符串:
[{ "code":"010100", "parentCode":"010000", "serial":"1.1 ", "level":2, "even":false, "name":"如何学习java", "gotChildren":"false", "id":"726", "chapterTitle":"1.1 如何学习java", "child":"false"},{ "code":"010200", "parentCode":"010000", "serial":"1.2 ", "level":2, "even":true, "name":"Java编程环境", "gotChildren":"false", "id":"187", "chapterTitle":"1.2 Java编程环境", "child":"false"}]
通常用大括号表示一个对象,用方括号表示数组。上面的字符串,表示一个数组,它有两个对象,每个对象,都有code、parentCode、serial、level等属性。
1.所有属性都是“键:值”的格式
2.每个键值对用逗号隔开
前端后台技术分开后,json已经成为了前后端数据交流的标准格式。一般来说,前端发起http请求,后台接受到请求后发送json数据,前端接受到数据后填入页面。后台不再负责页面的样式,包括布局、背景、字体、颜色等。那么一个jsp页面,如何发回一个纯json的应答呢?请看这个例子:
点击后可看到发回的json应答。
这是怎么做到的呢?
首先,需要导入一个写json格式的jar,这样的jar有很多种,它们的功能都大同小异,这里我们使用阿里云的json包
然后复制到项目的WEB-INF/lib文件夹下,再右键点击,“构建路径”-》“添加至构建路径”,如图所示:

这样在jsp中只要使用import语句导入,就可以使用阿里云的json工具包。
下面是一个简单的例子test.jsp,把一个user对象,直接转换成一个json字符串:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ page import="com.alibaba.fastjson.*,db.*"%><% String username = request.getParameter("username"); User user=UserData.getUserById(username); String json=JSON.toJSONString(user); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); response.getWriter().print(json);%>
其中第3行代码是导入json包,以及db包(db包有UserData,以及User两个类,参见4.3数据库
在这里为了测试json包,第6行代码的getUserById是新增加的函数,通过账号查询整个用户,完整函数如下:
public static User getUserById(String username){ User user=new User(); // 要执行的sql语句,通过字符串拼接出来 String SQLTEXT="select * from user where userName = '"+username+"'"; try{ //使用上面的DBConifg类的getCon方法,建立一个连接 Connection con=DBConfig.getCon(); //准备执行sql的实体 Statement stmt=con.createStatement(); //执行sql,并把查询结果赋给rst ResultSet rst=stmt.executeQuery(SQLTEXT); while(rst.next()){ //查询结果,并逐个把属性设置到user对象 user.setPassword(rst.getString("password")); user.setNickname(rst.getString("nickName")); user.setRole(rst.getString("role")); user.setCreateDate(rst.getString("create_date")); user.setUsername(username); } //后使用先关闭原则,关闭各个对象,特别是con如果不关闭,会造成连接泄露 rst.close(); stmt.close(); con.close(); } catch(SQLException e){ e.printStackTrace(); } return user;}
最后运行test.jsp,手动在test.jsp后加入username参数(图示的username的值是abcd,username的值可以是user表中任意一个账号),最终效果如图所示:
