JavaWeb——JSON语法讲解与Jackson解析器完成JSON数据与Java对象的转换(应用Ajax与JSON实现校验用户名是否在的功能)
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的基本简单格式、嵌套格式
<!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字符串;
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属性,分别在该属性处加不同的注解,运行程序,观察结果:
@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:与对象格式一致;
@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)
@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)注册页面
<!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
@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);
}
}
—————————————————————————————————
本文为博主原创文章,转载请注明出处!
- 有关 ASMX 2.0、WSE 3.0 和 WCF 的内容
- 微信小程序游戏其实一般,我也就站在寒风里玩了一个小时
- beagle MONO 应用的desktop search
- Python3与OpenCV3.3 图像处理(一)-环境搭建与简单DEMO
- winform中利用正则表达式得到有效的电话/手机号
- 浅述RDF,畅想一下FOAF应用
- 数据源控件参数类Parameter
- 我们来继续研究 mybatis 框架sql映射文件的属性
- 开源.NET邮件服务器
- 次次获得《头脑王者》满分的秘诀
- 如何在ASP.NET 2.0中定制Expression Builders
- codeproject 几篇asp.net文章
- .NET Web 自动化测试工具
- Javascript数组常用方法[包含MS AJAX.NET的prototype扩展方法]示例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入浅出mongodb(二)
- 算法——快速排序
- 算法——二分查找算法
- 第一篇——Ubuntu 安装 Elasticsearch
- Ubuntu安装Redis(手动编译)
- 第五节:Activiti6.0——流程定义相关API
- 第四节:Activiti6.0——使用zip、bpmn代码生成流程图的资源部署以及资源的查询
- 第三节:Activiti6.0——Query的API使用
- 第二节:Activiti6.0配置文件的读取
- SpringMvc配置文件上传
- 使用web.xml配置SpringMvc(使用Java加载配置)
- SpringMVC配置字符过滤器的两种方式
- SpringMvc使用Json(Java配置方式)
- 使用IDEA创建SpringMvc并整合Thymeleaf(Java配置版)
- Junit报错:Argument(s) are different! Wanted: