Java Web返回JSON
Web项目中经常涉及到AJAX请求返回JSON和JSONP数据。JSON数据在server端和浏览器端传输,本质上就是传输字符串,只是这个字符串符合JSON语法格式。浏览器端会依照普通文本的格式接收JSON字符串。终于JSON字符串转成JSON对象通过JavaScript实现。眼下部分浏览器(IE9下面浏览器没有提供)和经常使用的JS库都提供了JSON序列化和反序列化的方法。如jQuery的AJAX请求能够指定返回的数据格式,包含text、json、jsonp、xml、html等。
Webserver端仅仅要把Java对象数据转成JSON字符串。并把JSON字符串以文本的形式通过response输出就可以。
import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature; /**
*
* Web服务端返回JSON工具类
* 工具类依赖FastJSON
* 工具类支持返回JSON和JSONP格式数据
* @author accountwcx@qq.com
*
*/
public class ResponseJsonUtils {
/**
* 默认字符编码
*/
private static String encoding = "UTF-8"; /**
* JSONP默认的回调函数
*/
private static String callback = "callback"; /**
* FastJSON的序列化设置
*/
private static SerializerFeature[] features = new SerializerFeature[]{
//输出Map中为Null的值
SerializerFeature.WriteMapNullValue, //假设Boolean对象为Null。则输出为false
SerializerFeature.WriteNullBooleanAsFalse, //假设List为Null。则输出为[]
SerializerFeature.WriteNullListAsEmpty, //假设Number为Null。则输出为0
SerializerFeature.WriteNullNumberAsZero, //输出Null字符串
SerializerFeature.WriteNullStringAsEmpty, //格式化输出日期
SerializerFeature.WriteDateUseDateFormat
}; /**
* 把Java对象JSON序列化
* @param obj 须要JSON序列化的Java对象
* @return JSON字符串
*/
private static String toJSONString(Object obj){
return JSON.toJSONString(obj, features);
} /**
* 返回JSON格式数据
* @param response
* @param data 待返回的Java对象
* @param encoding 返回JSON字符串的编码格式
*/
public static void json(HttpServletResponse response, Object data, String encoding){
//设置编码格式
response.setContentType("text/plain;charset=" + encoding);
response.setCharacterEncoding(encoding); PrintWriter out = null;
try{
out = response.getWriter();
out.write(toJSONString(data));
out.flush();
}catch(IOException e){
e.printStackTrace();
}
} /**
* 返回JSON格式数据,使用默认编码
* @param response
* @param data 待返回的Java对象
*/
public static void json(HttpServletResponse response, Object data){
json(response, data, encoding);
} /**
* 返回JSONP数据,使用默认编码和默认回调函数
* @param response
* @param data JSONP数据
*/
public static void jsonp(HttpServletResponse response, Object data){
jsonp(response, callback, data, encoding);
} /**
* 返回JSONP数据,使用默认编码
* @param response
* @param callback JSONP回调函数名称
* @param data JSONP数据
*/
public static void jsonp(HttpServletResponse response, String callback, Object data){
jsonp(response, callback, data, encoding);
} /**
* 返回JSONP数据
* @param response
* @param callback JSONP回调函数名称
* @param data JSONP数据
* @param encoding JSONP数据编码
*/
public static void jsonp(HttpServletResponse response, String callback, Object data, String encoding){
StringBuffer sb = new StringBuffer(callback);
sb.append("(");
sb.append(toJSONString(data));
sb.append(");"); // 设置编码格式
response.setContentType("text/plain;charset=" + encoding);
response.setCharacterEncoding(encoding); PrintWriter out = null;
try {
out = response.getWriter();
out.write(sb.toString());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
} public static String getEncoding() {
return encoding;
} public static void setEncoding(String encoding) {
ResponseJsonUtils.encoding = encoding;
} public static String getCallback() {
return callback;
} public static void setCallback(String callback) {
ResponseJsonUtils.callback = callback;
}
}
/**
* 在Servlet返回JSON数据
*/
@WebServlet("/json.do")
public class JsonServlet extends HttpServlet {
private static final long serialVersionUID = 7500835936131982864L; /**
* 返回json格式数据
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, Object> data = new HashMap<String, Object>(); data.put("date", new Date());
data.put("email", "accountwcx@qq.com");
data.put("age", 30);
data.put("name", "csdn");
data.put("array", new int[]{1,2,3,4}); ResponseJsonUtils.json(response, data);
}
}
/**
* Servlet返回JSONP格式数据
*/
@WebServlet("/jsonp.do")
public class JsonpServlet extends HttpServlet {
private static final long serialVersionUID = -8343408864035108293L; /**
* 请求会发送callback參数作为回调函数,假设没有发送callback參数则使用默认回调函数
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//client发送的回调函数
String callback = request.getParameter("callback"); Map<String, Object> data = new HashMap<String, Object>(); data.put("date", new Date());
data.put("email", "accountwcx@qq.com");
data.put("age", 30);
data.put("name", "csdn");
data.put("array", new int[]{1,2,3,4}); if(callback == null || callback.length() == 0){
//假设client没有发送回调函数。则使用默认的回调函数
ResponseJsonUtils.jsonp(response, data);
}else{
//使用client的回调函数
ResponseJsonUtils.jsonp(response, callback, data);
}
}
}
/**
* 在Struts2中返回JSON和JSONP
*/
public class JsonAction extends ActionSupport {
private static final long serialVersionUID = 5391000845385666048L; /**
* JSONP的回调函数
*/
private String callback; /**
* 返回JSON
*/
public void json(){
HttpServletResponse response = ServletActionContext.getResponse(); Map<String, Object> data = new HashMap<String, Object>(); data.put("date", new Date());
data.put("email", "accountwcx@qq.com");
data.put("age", 30);
data.put("name", "csdn");
data.put("array", new int[]{1,2,3,4}); ResponseJsonUtils.json(response, data);
} /**
* 返回JSONP
*/
public void jsonp(){
HttpServletResponse response = ServletActionContext.getResponse(); Map<String, Object> data = new HashMap<String, Object>(); data.put("date", new Date());
data.put("email", "accountwcx@qq.com");
data.put("age", 30);
data.put("name", "csdn");
data.put("array", new int[]{1,2,3,4}); if(callback == null || callback.length() == 0){
//假设client没有发送回调函数,则使用默认的回调函数
ResponseJsonUtils.jsonp(response, data);
}else{
//使用client的回调函数
ResponseJsonUtils.jsonp(response, callback, data);
}
} public String getCallback() {
return callback;
} public void setCallback(String callback) {
this.callback = callback;
}
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; /**
* Spring MVC返回JSON和JSONP数据
*/
@Controller
@RequestMapping("/json")
public class JsonController { /**
* 返回JSON数据
* @param request
* @param response
*/
@RequestMapping("/json.do")
public void json(HttpServletRequest request, HttpServletResponse response){
Map<String, Object> data = new HashMap<String, Object>(); data.put("date", new Date());
data.put("email", "accountwcx@qq.com");
data.put("age", 30);
data.put("name", "csdn");
data.put("array", new int[]{1,2,3,4}); ResponseJsonUtils.json(response, data);
} /**
* 返回JSONP数据
* @param callback JSONP的回调函数
* @param request
* @param response
*/
@RequestMapping("/jsonp.do")
public void json(String callback, HttpServletRequest request, HttpServletResponse response){
Map<String, Object> data = new HashMap<String, Object>(); data.put("date", new Date());
data.put("email", "accountwcx@qq.com");
data.put("age", 30);
data.put("name", "csdn");
data.put("array", new int[]{1,2,3,4}); if(callback == null || callback.length() == 0){
//假设client没有发送回调函数,则使用默认的回调函数
ResponseJsonUtils.jsonp(response, data);
}else{
//使用client的回调函数
ResponseJsonUtils.jsonp(response, callback, data);
}
}
}
Java Web返回JSON的更多相关文章
- 在Spring MVC Controller的同一个方法中,根据App还是WEB返回JSON或者HTML视图。
如有高见,欢迎交流! 最近在做一个web的项目,web版已经开发完毕,现在正在进行手机APP的开发,开发中遇到一个问题: 就是web版和app版都有登录功能,本想着是分别走不同的URL,实际开发的时候 ...
- java 封装返回json数据
做的东西,一直是用easyui的,和后台的交互数据都是json格式的. 今天想要单独弄一个json数据返回给前台,其实是比较简单的问题,json接触不多,记录一下. 代码: public static ...
- java web 基础 json 和 javaBean转化
github地址: https://github.com/liufeiSAP/JavaWebStudy 实体类: package com.study.demo.domain; import com.f ...
- java ajax返回 Json 的 几种方式
原文:https://blog.csdn.net/qq_26289533/article/details/78749057 方式 1. : 自写代码转 Json 需要 HttpHttpServlet ...
- JAVA 接口返回JSON格式转换类
使用了Lombok插件 Result.java package com.utils; import com.jetsum.business.common.constant.Constant; impo ...
- MVC返回JSON数据格式书写方式
返回json数据格式,多个返回值加,隔开 [Route("api/users/web")] //如果不加这个路由请这样调用:/api/users/web?schoolname=十五 ...
- J2EE Web开发入门—通过action是以传统方式返回JSON数据
关键字:maven.m2eclipse.JSON.Struts2.Log4j2.tomcat.jdk7.Config Browser Plugin Created by Bob 20131031 l ...
- ASP.NET WEB API 返回JSON 出现2个双引号问题
前言 在使用ASP.NET WEB API时,我想在某个方法返回JSON格式的数据,于是首先想到的就是手动构建JSON字符串,如:"{\"result\" ...
- Web API返回JSON数据
对Web API新手来说,不要忽略了ApiController 在web API中,方法的返回值如果是实体的话实际上是自动返回JSON数据的例如: 他的返回值就是这样的: { "Conten ...
随机推荐
- 【枚举】【前缀和】【map】ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) C. Molly's Chemicals
处理出前缀和,枚举k的幂,然后从前往后枚举,把前面的前缀和都塞进map,可以方便的查询对于某个右端点,有多少个左端点满足该段区间的和为待查询的值. #include<cstdio> #in ...
- 【堆】bzoj1293 [SCOI2009]生日礼物
考虑poj3320尺取法的做法,与此题基本一样,但是此题的 位置 的范围到2^31 尺取法不可. 将每种珠子所在的位置排序. 每种珠子要维护一个指针,指到已经用到这个种类的哪个珠子. 所以尺取法用堆优 ...
- 【点分治】【乘法逆元】hdu4812 D Tree
思路比较裸,但是要把答案存到哈希表里面,这里需要一定技巧,否则会被K=1且点权全是1的数据卡飞.预处理乘法逆元.TLE了一天.换了种点分治的姿势…… #pragma comment(linker,&q ...
- jdk8新特性
JDK8新特性(JDK8的新特性) * 接口中可以定义有方法体的方法,如果是非静态,必须用default修饰 * 如果是静态的就不用了 class Test { public void run() { ...
- iOS 公司开发者账号申请清单
公司开发者账号申请清单: Apple ID账号申请: (有账号请提供账号密码) Apple ID: (最好是公司邮箱账号) Apple ID密码: (大于8位, 字母或数字组成, 包含 ...
- 再谈EditText只能输入金额
上次写了一篇EditText只能输入金额的博客,后来发现一个bug,当还未输入数字的情况下输入小数点程序就崩了,我去测了一下支付宝,看看会怎么样,我先输入小数点,程序正常,我再输入数字,可以正常输入, ...
- js之对象(经典)
一.对象的定义: 对象是JavaScript的一个基本数据类型,是一种复合值,它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值.即属性的无序集合. 二.对象的创建(多种方法) 1.对象 ...
- Dedecms getip()的漏洞利用
flyh4t在非安全发布了dedecms getip()的注射漏洞,漏洞本身的成因没什么好说的老掉牙的X-Forwarded-For的问题,我想这个漏洞很多人都找到了,不过这个漏洞的利用有个地方还是可 ...
- Hadoop之Azkaban详解
工作流调度器azkaban1 为什么需要工作流调度系统 1)一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序.hive脚本等 2)各任务单元之 ...
- idea 配置Spring MVC
一.idea 生成的Spring MVC 项目将<url-pattern>.form<url-pattern>改成<url-pattern>.do<url-p ...