JavaSelvert后台接收前端json数据,报错com.alibaba.fastjson.JSONObject cannot be cast to xxx,解决,记录贴

记录贴

环境:JavaSelvert后台获取前端json
使用库: com.alibaba.fastjson.JSONObject

在使用JavaSelvert后台获取从前端js传来的json串时报错com.alibaba.fastjson.JSONObject cannot be cast to xxx,看了其他一些大佬的博客,找到了解决方案。
首先从json格式入手

//如果json格式是这种的就会报上面的错误,无法将传过来的json转化成json对象,
{
    "insertUserList": [
        {
            "firstName": "Brett",
            "lastName": "McLaughlin",
            "email": "aaaa"
        },
        {
            "firstName": "Jason",
            "lastName": "Hunter",
            "email": "bbbb"
        },
        {
            "firstName": "Elliotte",
            "lastName": "Harold",
            "email": "cccc"
        }
    ]
}
//如果是这样的json块就不会报错
        {
            "firstName": "Jason",
            "lastName": "Hunter",
            "email": "bbbb"
        }

初步猜测,是因为前者的json数据是一组数据,而后者是一个json数据,也就是说Java后台如果接受到的是一组数据则需要先将一组数据(List)中的每一项提取出来才可以转化为json对象,所以就有了两种解决办法
第一种解决办法:
json 串可以分组发送每次只发生一个json串如上面的第一个json例子。
第二种解决办法
将从request中获取的json组先转化成List然后从List中获取单个json串转化成json对象
下面贴出第一种方法的Util类:

package content.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;

import com.alibaba.fastjson.JSONObject;


public class JSONUtil {
	
	/**
	 * 调用方法,转化成JSONObject对象
	 * @param request
	 * @return
	 */
	public static JSONObject getRequestJsonObject(HttpServletRequest request){
		String json = getRequestJsonString(request);
		return JSONObject.parseObject(json);
	}
	
	/**
	 * 从request中获取字节流
	 * @param request
	 * @return
	 */
	public static byte[] getRequestPostBytes(HttpServletRequest request ){
		int contentLength = request.getContentLength();
		if(contentLength < 0){
			return null;
		}
		byte buffer[] = new byte[contentLength];
		for(int i = 0 ; i < contentLength;){
			int readLen = -1;
			try {
				readLen = request.getInputStream().read(buffer,i,contentLength - 1);
			} catch (IOException e) {
				e.printStackTrace();
			}
			if(readLen == -1){
				break;
			}
			i += readLen;
		}
		return buffer;
	}
	
	/**
	 * 将request中的字节流按照指定编码(uft8)转换成字符串
	 * @param request
	 * @return
	 */
	public static String getRequestPostStr(HttpServletRequest request){
		byte buffer[] = getRequestPostBytes(request);
		String charEncoding = request.getCharacterEncoding();
		if(charEncoding == null){
			charEncoding = "UTF-8";
		}
		try {
			return new String(buffer,charEncoding);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 通过调用形式获取Json字符串
	 * @param request
	 * @return
	 */
	public static String getRequestJsonString(HttpServletRequest request){
		String submitMethod = request.getMethod();
		if(submitMethod.equals("GET")){
			try {
				return new String(request.getQueryString().getBytes("iso-8859-1"),"utf-8").replaceAll("%22", "\"");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}else{
			return getRequestPostStr(request);
		}
		return null;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值