一、概念
- JavaScript Object Notation JavaScript对象表示法
- json现在多用于存储和交换文本信息的语法
- 进行数据的传输
- JSON 比 XML 更小、更快,更易解析。
- 语法:
- 基本规则
- 数据在名称/值对中:json数据是由键值对构成的
- 键用引号(单双都行)引起来,也可以不使用引号
- 值得取值类型:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中) {“persons”:[{},{}]}
- 对象(在花括号中) {“address”:{“province”:“陕西”…}}
- null
- 数据由逗号分隔:多个键值对由逗号分隔
- 花括号保存对象:使用{}定义json 格式
- 方括号保存数组:[]
- 获取数据:
- json对象.键名
- json对象[“键名”]
- 数组对象[索引]
- 遍历
一、 JSON格式和数据的获取
- 定义基本格式
- 获取name的值 有两种:(1) json对象.键 (2) json对象[“键”]
var person = {"name": "张三", age: 23, 'gender': true};
//获取name的值 有两种 1.json对象.键 2.json对象["键"]
//var name = person.name;
var name = person["name"];
- 嵌套格式 JSON—数组—JSON
var persons = {
"persons": [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}
]
};
//获取王五值
var name1 = persons.persons[2].name;
- 数组----JSON
var ps = [{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}];
//获取李四值,弹出
alert(ps[1].name);
二、 JSON的遍历获取键值
1.使用for in循环遍历json,获取值不可以使用person.name 这种方法,因为它会自动个key加上引号。
//1.定义基本格式
var person = {"name": "张三", age: 23, 'gender': true};//获取name的值
//遍历使用for in 循环
for (var key in person){
// 在for in循环中获取值不可以使用person.name 这种,因为它会自动个key加上引号
var value = person[key];
alert(key+":"+value);
}
2.使用双重for循环 正常for循环和for in 循环遍历嵌套的json
//2.嵌套格式 []———> {}
var ps = [{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}];
for (var i = 0; i < ps.length; i++) {
//每一个p就是一个json
var p = ps[i];
for (var key in p){
//然后遍历每一个json
var value = p[key];
alert(key+":"+value);
}
}
二、Java对象和Json对象的相互转换
String 类型 Json格式的 str如何通过key-value得到数据。
String str = {"wendu":"100","shidu":"200"};
JSONObject object = new JSONObject(str);
int wendu = object.getInt("wendu");
String shidu = object.getString("shidu");
Java装Json:
- 使用jackson解析器的核心对象ObjectMapper,调用writeValu方法
package com.itcase.Jackson;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itcase.domain.Person;
import org.junit.Test;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Jackson_test1 {
@Test
public void test1() throws IOException {
//java对象转为json对象
Person p = new Person();
p.setName("张三");
p.setAge(22);
p.setGender("男");
//创建jackson的核心对象ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//1.mapper.writeValueAsString(Object) 将object转换为json对象
String json = mapper.writeValueAsString(p);
System.out.println(json);
/*
2.mapper.writeValue(参数1,Object)
参数1:
File:将obj对象转换为JSON字符串,并保存到指定的文件中
Writer:将obj对象转换为JSON字符串,并保存到指定的字符输出流
OutputStream:将obj对象转换为JSON字符串,并保存到指定的字节输出流
*/
mapper.writeValue(new File("E:\\a.txt"),p);
mapper.writeValue(new FileWriter("E:\\b.txt"),p);
}
}
- Json的注解
在Person类中加入日期属性private Date birthday;
public void test2() throws JsonProcessingException {
//java对象转为json对象
Person p = new Person();
p.setName("张三");
p.setAge(22);
p.setGender("男");
p.setBirthday(new Date());
ObjectMapper mapper = new ObjectMapper();
//1.mapper.writeValueAsString(Object) 将object转换为json对象
String json = mapper.writeValueAsString(p);
System.out.println(json);
}
结果:
{“name”:“张三”,“age”:22,“gender”:“男”,“birthday”:1605156999652}
在属性上加一个注解@JsonIgnore:
@JsonIgnore
private Date birthday;
结果如下:可以忽略这个日期属性
{“name”:“张三”,“age”:22,“gender”:“男”}
另一个注解:@JsonFormat(pattern = “”)
@JsonFormat(pattern = "yyyy年--MM月--dd日")
private Date birthday;
结果如下:可以定义日期格式
{“name”:“三”,“age”:22,“gender”:“男”,“birthday”:“2020年–11月–12日”}
- List和Map的转换
List.add(Person) :List装Person对象转成Json后成为数组:
[{“name”:“张三”,“age”:“22”},{" “:” “,” “:” “},{” “:” “,” “:” "}]这种格式
List.put(key,value):和装上面Person对象的输出格式一样
Json转Java:
mapper.readValue(json对象, java.class);
/是转义字符
@Test
public void test3() throws IOException {
String json = "{\"name\":\"张三\",\"age\":22,\"gender\":\"男\"}";
ObjectMapper mapper = new ObjectMapper();
//将json转换为java对象
Person person = mapper.readValue(json, Person.class);
System.out.println(person);
}
结果:
person{name=‘张三’, age=22, gender=‘男’}
三、案例
需求:失去鼠标焦点时候通过ajax和json进行客户端和服务器的通信,判断用户名是否存在。类似百度搜索,输入后下拉框数据的变化。
注意:服务器响应的数据,在客户端使用时,要想当做json数据格式使用。有两种解决方案:
- $.get(type):将最后一个参数type指定为"json"
- 在服务器端设置MIME类型
response.setContentType(“application/json;charset=utf-8”);
页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
//在页面加载完
$(function () {
//绑定一个blur 失去焦点的function
$("#username").blur(function () {
//获取到用户输入的value
var username = $(this).val();
//发送一个ajax请求 url ,键值,返回数据,type类型接收
$.get("findUserServlet",{username:username},function (date) {
//期望服务器响应回的数据格式:{"userExsit":true,"msg":"此用户名太受欢迎,请更换一个"}
// {"userExsit":false,"msg":"用户名可用"}
//设置一个span用于显示接收到的msg
var s_username = $("#s_username");
if (date.userExsit){
//用户存在 显示msg信息
s_username.css("color","pink");
s_username.html(date.msg);
}else{
//用户不存在
s_username.css("color","green");
s_username.html(date.msg);
}
},"json");
});
});
</script>
</head>
<body>
<form>
<input type="text" name="username" id="username" placeholder="请输入用户名">
<span id="s_username"></span>
<br>
<input type="password" name="password" placeholder="请输入密码"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
服务器端:
package com.itcase;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset = utf-8");
// response.setContentType("application/json;charset=utf-8");可以不用设置页面的$.get()的最后一个参数type
//1.用于接收regist.html传来的ajax请求 传来的username参数
String username = request.getParameter("username");
//2.设置一个map 存放数据格式:{"userExsit":true,"msg":"此用户名太受欢迎,请更换一个"}{"userExsit":false,"msg":"用户名可用"}
Map<String,Object> map = new HashMap<String,Object>();
//3.此次判断应该由service层调用dao层数据库,现在简化判断
if ("tom".equals(username)){
map.put("userExsit",true);
map.put("msg","此用户名太受欢迎,请更换一个");
}else{
map.put("userExsit",false);
map.put("msg","用户名可用");
}
//4.ObjectMapper核心对象
ObjectMapper mapper = new ObjectMapper();
//5.将map用输出流直接输出到页面响应
mapper.writeValue(response.getWriter(),map);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
结果: