前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaWeb——JSON语法讲解与Jackson解析器完成JSON数据与Java对象的转换(应用Ajax与JSON实现校验用户名是否在的功能)

JavaWeb——JSON语法讲解与Jackson解析器完成JSON数据与Java对象的转换(应用Ajax与JSON实现校验用户名是否在的功能)

作者头像
Winter_world
发布2020-09-25 10:34:49
3K0
发布2020-09-25 10:34:49
举报

1 JSON基本概述

JSON,全名为JavaScript Object Notation,JavaScript对象表示法。Java中我们为了封装一些数据,可以定义一个对象,用对象作为参数传递数据会很方便,比如,一个Person对象:

  • Person p = new Person();
  • p.setName("妲己");
  • p.setAge(18);

那么,在JavaScript中也想干同样的事情,用JSON数据格式来表示对象就被称为JavaScript对象表示法,比如:

  • var p = {"name":"妲己", "age":18};

早期,JSON是用来表示JavaScript对象的一种方式,当前,JSON有了更加广泛的应用:

  • JSON多用于存储和交换文本信息的语法,类似XML;
  • 进行数据的传输;
  • 比XML更小更快,更易于解析;

2 JSON的语法

2.1 基本规则

  • 数据在名称/值对中:数据由键值对构成,键:用引号引起来,单双均可,也可以不使用引号;值的取值类型如下: 类型描述数字整数或浮点数字符串在双引号中逻辑值true或false数组方括号[]中,如{"persons":[{},{}]}对象花括号{}中,如{"address":{"province":"北京",....}}null空
  • 数据由逗号分隔:多个键值对由逗号分隔;
  • 花括号保存对象:{}定义json格式;
  • 方括号保存数组:[]

【注意】:虽然键的写法比较随意,但是最好有一个良好的习惯,编程时风格统一,要加引号就全加,也方便阅读。

【练习】:分别定义json的基本简单格式、嵌套格式

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        //1、定义基本格式
        var person = {"name":"妲己",age:18,'gender':true};
        // alert(person);
        //2、嵌套   {}->[]
        var persons = {
            "persons":[
                {"name":"哪吒","age":16,"gender":true},
                {"name":"李天王","age":40,"gender":true},
                {"name":"孙悟空","age":26,"gender":true}
                ]
        };
        // alert(persons);
        //3、嵌套  [] ->{}
        var ps = [
                {"name":"哪吒","age":16,"gender":true},
                {"name":"李天王","age":40,"gender":true},
                {"name":"孙悟空","age":26,"gender":true}
                ];
        alert(ps);
    </script>
</head>
<body>

</body>
</html>

2.2 获取数据

获取数据的方式有以下几种:

  • 1)json对象.键名
  • 2)json对象["键名"]
  • 3)数组对象[索引]

【代码实现】:还是在上一节的代码基础上,如下所示:

  • 1)person.name; 或 person["name"];
  • 2)persons.persons[0].name;
  • 3)ps[1].name;

3 JSON数据与Java对象的相互转换

网络中以JSON数据进行数据传输时,需要进行JSON数据与Java对象的转换:

  • 1)Java对象转为JSON
  • 2)JSON转为Java对象

一般实际项目中都会使用JSON解析器,实现这个转换过程,常见的JSON解析器:Jsonlib、Gson、fastjson、jackson(也是SpringMVC框架内置的解析器),我们此处使用jackson解析器。

3.1 Java对象转为JSON

【使用步骤】:

  • 1)导入jackson的相关jar包;
  • 2)创建jackson的核心对象ObjectMapper;
  • 3)调用ObjectMapper的相关方法进行转换;

【ObjectMapper核心对象的转换方法】:

1)writeValue(参数1,obj),将obj对象转换为JSON字符串,其中参数1的值决定了JSON字符串的填充位置:

  • File:保存到指定的文件中;
  • Writer:填充到字符输出流中;
  • OutputStream:填充到字节输出流中;

2)writeValueAsString(obj),将对象转化为JSON字符串,返回字符串值;

练习案例:新建一个Person类,练习以上两种方法,将Person对象转换为JSON字符串;

代码语言:javascript
复制
public class JacksonTest {

    //Java对象转换为JSON
    @Test
    public void test1() throws Exception {
        //1)创建Person对象
        Person p = new Person();
        p.setName("张三");
        p.setAge(12);
        p.setGender("男");
        //2)创建Jackson的核心对象
        ObjectMapper mapper = new ObjectMapper();
        //3)转换
        String s = mapper.writeValueAsString(p);
        System.out.println(s);//{"name":"张三","age":12,"gender":"男"}
        //将数据写到d盘下a.txt中
        mapper.writeValue(new File("d://a.txt"),p);
        //将数据关联到writer中
        mapper.writeValue(new FileWriter("d://b.txt"),p);

    }
}

【注解】:在对象的对应属性位置使用

  • 1)@JsonIgnore:排除属性,排除后对应属性的键值对不会被转换为字符串;
  • 2)@JsonFormat:属性值的格式化;

练习案例:在如上Person类中加一个birthday属性,分别在该属性处加不同的注解,运行程序,观察结果:

代码语言:javascript
复制
    @Test
    public void test2() throws JsonProcessingException {
        //1)创建Person对象
        Person p = new Person();
        p.setName("张三");
        p.setAge(12);
        p.setGender("男");
        p.setBirthday(new Date());
        //2)转换
        ObjectMapper mapper = new ObjectMapper();
        String s = mapper.writeValueAsString(p);
        System.out.println(s);
        //无任何注解:{"name":"张三","age":12,"gender":"男","birthday":1597643595144}
        //@JsonIgnore注解:{"name":"张三","age":12,"gender":"男"}
        //@JsonFormat(pattern = "yyyy-MM-dd")注解:{"name":"张三","age":12,"gender":"男","birthday":"2020-08-17"}
    }

【复杂Java对象的转换】

实际开发开发中,经常会用到List和Map集合,那针对这种的转换该如何进行?实际上应用和上述是一样的:

  • List:数组;
  • Map:与对象格式一致;
代码语言:javascript
复制
@Test
    public void test3() throws JsonProcessingException {
        //1)创建Person对象
        Person p1 = new Person();
        p1.setName("张三");
        p1.setAge(12);
        p1.setGender("男");
        p1.setBirthday(new Date());

        Person p2 = new Person();
        p2.setName("李四");
        p2.setAge(13);
        p2.setGender("女");
        p2.setBirthday(new Date());

        List<Person> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);

        //2)转换
        ObjectMapper mapper = new ObjectMapper();
        String s = mapper.writeValueAsString(list);
        System.out.println(s);//[{"name":"张三","age":12,"gender":"男","birthday":"2020-08-17"},{"name":"李四","age":13,"gender":"女","birthday":"2020-08-17"}]

    }

    @Test
    public void test4() throws JsonProcessingException {
        //1)创建Map集合
        Map<String,Object> map = new HashMap<>();
        map.put("name","张三");
        map.put("age",23);
        map.put("gender","男");

        //2)转换
        ObjectMapper mapper = new ObjectMapper();
        String s = mapper.writeValueAsString(map);
        System.out.println(s);//{"gender":"男","name":"张三","age":23}
    }

3.2 JSON转为Java对象

使用步骤同Java对象转为JSON,看下ObjectMapper核心对象的转换方法:

readValue(json字符串数据,Class)

代码语言:javascript
复制
    @Test
    public void test5() throws Exception {
        String s="{\"gender\":\"男\",\"name\":\"张三\",\"age\":23}";
        ObjectMapper mapper = new ObjectMapper();
        Person p = mapper.readValue(s,Person.class);
        System.out.println(p.toString());
    }

4 实战案例:校验用户名是否存在

【需求】:输入用户名,当文本输入框失去焦点后,发送ajax请求,查询数据库是否存在该用户名,若存在:提示信息:此用户名太受欢迎,请更换一个;若不存在,则提示信息:可用。

【代码实现】:

这里需要注意,服务器响应的JSON数据,要在客户端使用时,需要做下处理,有两种方式:

  • $.get(type),最后一个参数type指定为“json”;
  • 在服务器端设置MIME类型为json:response.setContentType("application/json;charset=utf-8");

1)注册页面

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <script src="js/jquery-3.3.1.min.js"></script>
    <script>
        $(function () {
            //给username绑定失去blur事件
          $("#username").blur(function () {
              //获取username文本框输入的值
              var username = $(this).val();
              //发送ajax请求
              //期望服务器响应的数据格式:{"userExist":true,"msg":“此用户名太受欢迎,请更换一个”}
              //{"userExist":false,"msg":“用户名可用”}
              $.get("findUserServlet",{"username":username},function (data) {
                //判断userExist的值是否true
                  var span = $("#s_username");
                  if(data.userExist){
                      span.css("color","red")
                      span.html(data.msg);
                  }else {
                      span.css("color","green")
                      span.html(data.msg);
                  }
              },"json");
          })
        });
    </script>
</head>
<body>
    <form>
        <input type="text" id = "username" name="username" placeholder="请输入用户名">
        <span id="s_username"></span>
        <br>
        <input type="password" name="password" placeholder="请输入密码"> <br>
        <input type="submit" value="注册"> <br>

    </form>
</body>
</html>

2)FindUserServlet

代码语言:javascript
复制
@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取用户名
        String username = request.getParameter("username");
        //调用service层判断用户名是否存在
        //期望服务器响应的数据格式:{"userExist":true,"msg":“此用户名太受欢迎,请更换一个”}
        //{"userExist":false,"msg":“用户名可用”}
        response.setContentType("text/html;charset=utf-8");
//        response.setContentType("application/json;charset=utf-8");
        Map<String,Object> map = new HashMap<>();
        if("zhangsan".equals(username)){
            map.put("userExist",true);
            map.put("msg","此用户名太受欢迎,请更换一个");
        }else{
            map.put("userExist",false);
            map.put("msg","用户名可用");
        }
        //map转换为json,并传递给客户端
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(response.getWriter(),map);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

—————————————————————————————————

本文为博主原创文章,转载请注明出处!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 JSON基本概述
  • 2 JSON的语法
    • 2.1 基本规则
      • 2.2 获取数据
      • 3 JSON数据与Java对象的相互转换
        • 3.1 Java对象转为JSON
          • 3.2 JSON转为Java对象
          • 4 实战案例:校验用户名是否存在
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档