本人小白一枚,欢迎大家一起讨论学习,如有错误,还望大家指教。
简述:
Json全称JavaScript Object Notation译为JavaScript对象表示法,它是是一种轻量级的数据交换格式。多用于存储和交换文本信息以及数据的传输,Json比Xml体积更小、传输更快、更加容易解析。
语法:
一、基本规则:
- json数据是由键值对构成的,键用引号(单双都行)引起来,也可以不用引号。
- 值的取值类型
- 数字(整数或浮点数)
- 字符串(用双引号引上)
- 逻辑值(true或false)
- 数组(在方括号中),例如:
{"person":[{元素1}, {元素2}]}
- 对象(在花括号中),例如:
{"address":{"province":"陕西".....}}
- null
- 数据由逗号分隔:多个键值对由逗号分隔,例如:
{"name": "张三", age: 23, 'gender': true}
- 花括号保存对象:使用
{}
定义json格式 - 方括号保存数组:使用
[]
定义json格式
二、获取数据:
- json对象.键名
- json对象[“键名”]
- 数组对象[索引]
- 遍历
<script>
// 定义一个对象
var person = {"name":"张三", "age":23, "gender":true};
// 定义一个对象数组
var persons = [{"name":"张三", "age":23, "gender":true},
{"name":"李四", "age":25, "gender":false},
{"name":"王五", "age":28, "gender":true}];
// 遍历对象,这里不能使用person.key,因为这里的可以是一个字符串,使用了相当于:person."name",肯定取不到对应的值
for(var key in person) {
alert(key + ":" + person[key]);
}
// 遍历对象数组
for(var i = 0; i < persons.length;i++) {
var person = persons[i];
for(var key in person) {
alert(key + ":" + person[key]);
}
}
</script>
三、JSON数据和Java对象的相互转换
常见的JSON解析器:
解析器有Jsonlib(官方)、Gson(谷歌)、fastjson(阿里)、jackson(spring内置的json解析器,也是我们下面将要了解的)等等。
使用演示:使用前别忘记导入jar包,这里使用的是jackson-databind-2.2.3.jar、jackson-core-2.2.3.jar、jackson-annotations-2.2.3.jar
// 这里定义了一个Person实体类,含有四个属性
private String name;
private int age;
private String address;
private Date birthday;
/**
* 将json字符串转化为java对象
* @throws IOException
*/
@Test
public void test1() throws IOException {
// 定义一个json字符串
String jsonStr = "{\"name\":\"张三\", \"age\":23, \"address\":\"北京\"}";
// 创建Jackson的核心对象 ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
// 将指定的json字符串转化为java对象
Person person1 = objectMapper.readValue(jsonStr, Person.class);
// 读取指定磁盘下的文件,并将其json字符串内容转化为java对象
Person person2 = objectMapper.readValue(new File("F://test.txt"), Person.class);
System.out.println(person1.toString());
System.out.println(person2.toString());
}
Person{name=‘张三’, age=23, address=‘北京’, birthday=null}
Person{name=‘李四’, age=25, address=‘哈尔滨’, birthday=null}
/**
* 将java对象转化为json字符串
* @throws JsonProcessingException
*/
@Test
public void test2() throws JsonProcessingException {
Person person = new Person();
person.setName("李四");
person.setAge(25);
person.setAddress("天津");
person.setBirthday(new Date());
// 创建Jackson的核心对象 ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
// 使用writeValueAsString()进行操作
String jsonStr = objectMapper.writeValueAsString(person);
System.out.println(jsonStr);
}
{“name”:“李四”,“age”:25,“address”:“天津”,“birthday”:1572143205056}
这里我们会发现,转化后Date类型的birthday属性会转化为毫秒值,为了解决这个问题,我们可以使用@JsonFormat
这个注解,该注解可以将属性值以指定的格式进行转化,例如,我们在实体类中的birthday字段使用这个注解,再次打印结果如下:
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
{“name”:“李四”,“age”:25,“address”:“天津”,“birthday”:“2019-10-27”}
我们也可以指定特定的属性让它不转化为json字符串,使用@JsonIgnore
这个注解。
@JsonIgnore
private String address;
{“name”:“李四”,“age”:25,“birthday”:“2019-10-27”}
/**
* 将java对象集合转化为json字符串
* @throws JsonProcessingException
*/
@Test
public void test2() throws JsonProcessingException {
Person person1 = new Person("李四", 24, "哈尔滨", new Date());
Person person2 = new Person("王五", 25, "吉林", new Date());
Person person3 = new Person("刘六", 26, "长春", new Date());
// 创建一个集合,并且Person对象放进集合
List<Person> personList = new ArrayList<Person>();
personList.add(person1);
personList.add(person2);
personList.add(person3);
ObjectMapper objectMapper = new ObjectMapper();
// 使用writeValueAsString()进行操作
String jsonStr = objectMapper.writeValueAsString(personList);
System.out.println(jsonStr);
}
[{“name”:“李四”,“age”:24,“address”:“哈尔滨”,“birthday”:“2019-10-27”}, {“name”:“王五”,“age”:25,“address”:“吉林”,“birthday”:“2019-10-27”},{“name”:“刘六”,“age”:26,“address”:“长春”,“birthday”:“2019-10-27”}]
/**
* 将map集合转化为json字符串
* @throws JsonProcessingException
*/
@Test
public void test3() throws JsonProcessingException {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "张三");
map.put("age", 23);
map.put("address", "火星");
ObjectMapper objectMapper = new ObjectMapper();
String jsonStr = objectMapper.writeValueAsString(map);
System.out.println(jsonStr);
}
{“address”:“火星”,“name”:“张三”,“age”:23}
也可以使用writerValue(参数1, obj)
方法来将json对象转化为java对象。
- writeValue(参数1,obj):
File:
将obj对象转换为JSON字符串,并保存到指定的文件中。Writer:
将obj对象转换为JSON字符串,并将json数据填充到字符输出流中。OutputStream:
将obj对象转换为JSON字符串,并将json数据填充到字节输出流中。
小案例:检验用户名是否存在
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
$(function () {
$("#username").blur(function () {
$.get("checkUserName", {"username":$(this).val()}, function (data) {
if(data.flag) {
$("#warn").css("color", "red");
$("#warn").html(data.log);
} else {
$("#warn").css("color", "green");
$("#warn").html(data.log);
}
});
});
}, "json");
</script>
</head>
<body>
<label for="username">请输入用户名:</label><input type="text" id="username">
<span id = "warn"></span>
</body>
</html>
@WebServlet("/checkUserName")
public class CheckUserServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
ObjectMapper objectMapper = new ObjectMapper();
// 用来存放响应数据
Map<String, Object> map = new HashMap<String, Object>();
response.setContentType("application/json;charset=utf-8");
if ("tom".equals(username)) {
map.put("flag", true);
map.put("log", "此用户名太受欢迎了,换一个吧!");
response.getWriter().write(objectMapper.writeValueAsString(map));
} else {
map.put("flag", false);
map.put("log", "此用户名可用哦!");
response.getWriter().write(objectMapper.writeValueAsString(map));
}
}
}