利用AJAX向后台servlet传JSON数据,后台利用fastjson进行解析

本文详细介绍了JSON作为web传输主流格式的应用,包括在前台使用ajax发送JSON数据,以及在后台servlet中解析JSON数据的方法。涵盖了单个对象及数组格式的JSON数据处理,通过实例展示了如何利用fastjson进行解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JSON是web传输中主流的数据传输格式,从其格式来看,格式相当的简洁,层次也相当分明。这样的话会利于我们构建与解析JSON,下面举例说明如何在前台如何利用ajax去传输json,并且在后台servlet去解析json。如有错误,请多多指正!

 

一,json的构建

JSON的格式分为两种,第一种类似于JavaScript中的对象(这里需要注意的是JS中的对象与java中的对象概念是不一样的,js可以在对象中定义属性,方法等,类似于java中的类,但是java中的对象实际上是类实例化的结果,是一个类的实例);第二种类似对象数组格式。

下面创建js对象:两个对象obj1和obj2,一个包含两个对象的数组;

var obj1 = {
    name: "小明",
    age: 25
}

var obj2 = {
    name = "小王",
    age = 19
}

var arr = [obj1,obj2];

二、JSON的发送

假如我们只需要发送某个对象的name和age值到后台,我们只需要发送obj1或者obj2就行。下面是JS代码

$.ajax({
    async: true,
    url: "parseJson.do",
    data: JSON.stringify(obj1),
    processData: false,
    success: function(data){
        //some code
    }
})

三、后台servlet接收

是不是很简单,下面创建一个servlet来接收前台发过来的数据

//省略import各种包


@WebServlet("/parseJson.do")
public class ParseJsonServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //先创建字符流来读取json
        BufferedReader reader = new BufferedReader(req.getReader());
        String json = reader.readLine();
        //这里用fastjson来解析
        JSONObject jo = JSON.parseObject(json);
        //获取name和age对应的值
        String name = jo.getString("name");
        int age = jo.getInteger("age");
        System.out.println("name: "+name+";"+"age: "+age);
    }
}

运行结果:

于是后台顺利获得前台传来的值;

四、发送数组格式的JSON如何解析呢?

 首先构建数组格式的json:就是创建对象数组,前台代码

$.ajax({
    async: true,
    url: "parseJson.do",//URL没有变意味着我用同一个servlet哦,演示本例的时候吧之前的都注释掉了
    data: JSON.stringify(arr),
    processData: false,
    success: function(data){
        //some code
    }
})

后台还是用servlet

//省略import各种包


@WebServlet("/parseJson.do")
public class ParseJsonServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //先创建字符流来读取json
        BufferedReader reader = new BufferedReader(req.getReader());
        String json = reader.readLine();
        //这里用fastjson来解析数组,我并不知道解析的数据是哪个对象,所以用了object的集合
        List<Object> list = JSONArray.parseArray(json);
        //输出
        System.out.println(list.get(0));
        System.out.println(list.get(1));
   }
}

输出结果:

 

这不是输出的两行“JSON”吗?我如何获取name和age的值呢?

方法1:创建包含name和age成员变量的实体类,利用get方法不就能获取值了!

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

接着我们修改servlet:

//省略import各种包


@WebServlet("/parseJson.do")
public class ParseJsonServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //先创建字符流来读取json
        BufferedReader reader = new BufferedReader(req.getReader());
        String json = reader.readLine();
        //这里用fastjson来解析数组,我并不知道解析的数据是哪个对象,所以用了object的集合
        //List<Object> list = JSONArray.parseArray(json);
        //利用JSONArray.parseArray()方法的重载
        List<Person> list = JSONArray.parseArray(json,Person.class);
        System.out.print("obj1的姓名" + list.get(0).getName());
        System.out.print("obj2的年龄" + list.get(1).getAge());
   }
}

 输出结果:

这样顺利的获取name和age的值

方法2:我不想创建实体类,我对得到的类似于"JSON"的东西继续进行解析

还是修改servlet:

//省略import各种包


@WebServlet("/parseJson.do")
public class ParseJsonServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //先创建字符流来读取json
        BufferedReader reader = new BufferedReader(req.getReader());
        String json = reader.readLine();
        //这里用fastjson来解析数组,我并不知道解析的数据是哪个对象,所以用了object的集合
        //List<Object> list = JSONArray.parseArray(json);
          
        //解析第一个'JSON'

        JSONObject jo1 = JSON.parseObject(String.valueOf(list.get(0)));

        //获取obj1的name
        String name1  = jo1.getString("name");
        
        //获取obj2的age

        JSONObject jo2 = JSON.parseObject(String.valueOf(list.get(1)));
        int age2  = jo2.getInteger("age");

        System.out.println("obj1的name: "+name1+"obj2的age"+age2);
   }
}

运行的结果:

 

同样成功获得前台数据;

the end~~ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值