使用json进行数据格式传输

json简介

json的全称是JavaScript Object Notation,是一种数据交换格式,独立于编程语言,可以用来存储数据,优点是非常利于人类阅读和编写,同时也利于机器的解析和生成,同时还可以提升网络传输效率。
json的数据格式是以名-值对的方式存储的,可以将其看做是一个字符串,下面就是一个json格式的数据,对象会放到{}中,数组放到[]中:

对象:
{"name":"monkey1024","age":18,"hobby":"java"}

数组:
[{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}]

在json中规定的字符编码时utf-8,几乎所有的编程语言都有解析json数据的第三方库,因此json的应用非常多。在servlet中可以将要返回给前台的数据封装为json格式,在前台中可以使用javascript来解析,javascript已经内置了json的解析。

在javascript中创建json对象:

<script type="text/javascript">

    //创建一个json对象
    let student = {"name":"jack","age":18};
    console.log(student.name);

    //创建一个数组,数组中存放json对象
    let animal = [{"name":"monkey","count":10},{"name":"tiger","count":5}];
    console.log(animal[0].name);
</script>

通过上面示例可以看出在javascript中使用json非常方便。

json格式的数据是跟语言无关的,在java中也有非常多的第三方库可以解析json格式的数据,常用的有:

  • fastjson:国人开发的,是目前java语言中最快的json库
  • gson:google开发
  • jackson:Tatu Saloranta开发

下面以fastjson为例看下,fastjson相关jar包下载地址:http://pan.baidu.com/s/1jIagJII

fastjson中常用的方法:

  • JSON.toJSONString

    将JavaBean转成json格式的字符串

  • JSON.parseObject

    将json格式的字符串转换为JavaBean

代码示例:

创建一个City类,表示城市:

package com.monkey1024.bean;

/**
 * 城市
 *
 */
public class City {

    private int id;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

}

创建一个Province类表示省份:

package com.monkey1024.bean;

import java.util.List;

/**
 * 省份
 *
 */
public class Province{

    private String name;

    private List<City> cities;

    public String getName() {
        return name;
    }

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

    public List<City> getCities() {
        return cities;
    }

    public void setCities(List<City> cities) {
        this.cities = cities;
    }

}

fastjson测试类:

package com.monkey1024.test;

import java.util.ArrayList;
import java.util.List;

import com.alibaba.fastjson.JSON;
import com.monkey1024.bean.City;
import com.monkey1024.bean.Province;

public class JsonTest {

    public static void main(String[] args) {

        City c1 = new City();
        c1.setId(1005);
        c1.setName("石家庄");

        City c2 = new City();
        c2.setId(1006);
        c2.setName("唐山");

        City c3 = new City();
        c3.setId(1007);
        c3.setName("保定");

        List<City> cities = new ArrayList<>();
        cities.add(c1);
        cities.add(c2);
        cities.add(c3);

        Province hebei = new Province();
        hebei.setName("河北");
        hebei.setCities(cities);
        //将Province对象转换为json格式并返回字符串
        String hebeiString = JSON.toJSONString(hebei);
        System.out.println(hebeiString);

        //将json格式的字符串转换为Province对象
        Province hebeiNew = JSON.parseObject(hebeiString, Province.class);
        System.out.println(hebeiNew.getName());

    }

}

使用json进行数据传输

将百度下拉提示框中的代码改成使用json格式进行数据传输。
将SearchServlet类中的doGet方法修改为下面内容:

// 根据用户输入的数据去查询数据库,这里省略数据库查询操作,手动编写一个List结果集
List<String> result = new ArrayList<>();
result.add("m1");
result.add("m2");
result.add("m3");
result.add("m4");
result.add("m5");

//将List转换为string类型
String str = JSONArray.toJSONString(result);

// 把数据响应到客户端
response.getWriter().write(str);

因为servlet中返回了一个JSON字符串,所以需要在javascript中将该字符串转换为JSON类型,因此将前台代码中的删掉:

let result = str.split(",");

将$.ajax中的参数dataType的值改成”json”,这样后台就能直接以json格式接收后台返回的数据了。此时直接遍历回调函数的参数data即可

由此可见使用json进行数据传输时可以减少开发者的操作并且提高系统的运行效率(之前需要遍历list并进行拼接)。