一,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);
}
}
运行的结果:
同样成功获得前台数据