JSON,全名为JavaScript Object Notation,JavaScript对象表示法。Java中我们为了封装一些数据,可以定义一个对象,用对象作为参数传递数据会很方便,比如,一个Person对象:
那么,在JavaScript中也想干同样的事情,用JSON数据格式来表示对象就被称为JavaScript对象表示法,比如:
早期,JSON是用来表示JavaScript对象的一种方式,当前,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>
获取数据的方式有以下几种:
【代码实现】:还是在上一节的代码基础上,如下所示:
网络中以JSON数据进行数据传输时,需要进行JSON数据与Java对象的转换:
一般实际项目中都会使用JSON解析器,实现这个转换过程,常见的JSON解析器:Jsonlib、Gson、fastjson、jackson(也是SpringMVC框架内置的解析器),我们此处使用jackson解析器。
【使用步骤】:
【ObjectMapper核心对象的转换方法】:
1)writeValue(参数1,obj),将obj对象转换为JSON字符串,其中参数1的值决定了JSON字符串的填充位置:
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);
}
}
【注解】:在对象的对应属性位置使用
练习案例:在如上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集合,那针对这种的转换该如何进行?实际上应用和上述是一样的:
@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}
}
使用步骤同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());
}
【需求】:输入用户名,当文本输入框失去焦点后,发送ajax请求,查询数据库是否存在该用户名,若存在:提示信息:此用户名太受欢迎,请更换一个;若不存在,则提示信息:可用。
【代码实现】:
这里需要注意,服务器响应的JSON数据,要在客户端使用时,需要做下处理,有两种方式:
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);
}
}
—————————————————————————————————
本文为博主原创文章,转载请注明出处!