一天前端问后端,我需要的数据呢?后端程序员小哥说我给你打包成json了。啊,json是个啥?我该怎么用…
本文目录
1.JSON概念
JSON:JavaScript Object Notation
,是JavaScript对象表示法。
比如Java中的一个Person对象:
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
Person对象使用JavaScript对象表示为:
var p = {
"name":"张三","age":23,"gender":"男"};
而{"name":"张三","age":23,"gender":"男"}
这样的数据,就称为JSON 格式数据,早期的JSON 就是JavaScript来表示对象的一个手段。现在的JSON 有着更广泛的应用:
- json现在多用于存储和交换文本信息的语法
- 进行数据的传输
- JSON 比 XML 更小、更快,更易解析。
2.JSON语法
2.1 基本规则
先说一下json语法的基本规则:
-
数据在 “名称/值” 对中:json数据是由键值对构成的:
-
键是字符串类类型,用引号(单双都行)引起来,也可以不使用引号
-
值的取值类型 例子 1 数字(整数或浮点数) {"number":5}
或{"number":12.20}
2 字符串(在双引号中) {"name":"董"}
3 逻辑值(true 或 false) {"isMale":true}
4 数组(在方括号中) {"persons":[{},{}]}
5 对象(在花括号中) {"address":{"province":"陕西","city":"西安"}}
6 null {"money":null}
-
-
数据由逗号分隔:多个键值对由逗号
,
分隔 -
花括号保存的是对象:使用{ }定义 json 格式
-
方括号保存数组:[ ]
例子:
01-json数据语法.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//1.定义基本格式
var person = {
"name": "张三", age: 23, 'gender': true};
//打印
console.log(person);
//2.嵌套格式 {}———> [],嵌套数组
var persons = {
"persons": [
{
"name": "张三", "age": 23, "gender": true},
{
"name": "李四", "age": 24, "gender": true},
{
"name": "王五", "age": 25, "gender": false}
]
};
//打印
console.log(persons);
//2.嵌套格式 []———> {},数组嵌套对象
var ps = [
{
"name": "张三", "age": 23, "gender": true},
{
"name": "李四", "age": 24, "gender": true},
{
"name": "王五", "age": 25, "gender": false}
];
//打印
console.log(ps);
</script>
</head>
<body>
</body>
</html>
访问该页面,F12打开浏览器控制台,查看打印情况:
都能打印出来,说明定义的json数据格式没有问题。
2.2 获取数据
获取数据的方式是下面前三种方式,最后再演示一下遍历数据:
- json对象.键名
- json对象[“键名”]
- 数组对象[索引]
- 遍历
用简单的例子来体会一下获取数据:
02-json获取数据.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//1.定义基本格式
var person = {
"name": "张三", age: 23, 'gender': true};
//获取name的值
var name = person.name;//方式1
//获取age的值
var age = person["age"];//方式2
//打印
console.log(name+"-"+age);
console.log("======================");
//2.嵌套格式 {}———> [],嵌套数组
var persons = {
"persons": [
{
"name": "张三", "age": 23, "gender": true},
{
"name": "李四", "age": 24, "gender": true},
{
"name": "王五", "age": 25, "gender": false}
]
};
//获取王五值
var Ww = persons.persons[2].name;
//打印
console.log(Ww);
console.log("======================");
//2.嵌套格式 []———> {},数组嵌套对象
var ps = [
{
"name": "张三", "age": 23, "gender": true},
{
"name": "李四", "age": 24, "gender": true},
{
"name": "王五", "age": 25, "gender": false}
];
//获取李四值
var Ls = ps[1].name;
//打印
console.log(Ls);
</script>
</head>
<body>
</body>
</html>
访问该页面,F12打开浏览器控制台,查看打印情况:
遍历数据:使用for in
循环
- 获取person对象中所有的键和值
- 获取对象数组
ps
中的所有值
03-json获取数据_遍历.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//1.定义基本格式
var person = {
"name": "张三", age: 23, 'gender': true};
//2.对象数组
var ps = [
{
"name": "张三", "age": 23, "gender": true},
{
"name": "李四", "age": 24, "gender": true},
{
"name": "王五", "age": 25, "gender": false}
];
//for in 循环
//获取person对象中所有的键和值
for(var key in person){
//注意:person.key 这样的方式获取不行。因为key是字符串类型,相当于 person."name",语法错误,显示获取的是undefined
//打印
console.log(key+":"+person[key]);
}
console.log("===================");
//获取ps中的所有值,嵌套for in 循环
for (var i = 0; i < ps.length; i++) {
var p = ps[i];
for(var key in p){
console.log(key+":"+p[key]);
}
console.log("---------");
}
</script>
</head>
<body>
</body>
</html>
访问该页面,F12打开浏览器控制台,查看打印情况:
3.JSON数据和Java对象的相互转换
为什么需要JSON数据和Java对象的相互转换?
因为一般JSON作为数据的载体,在网络中进行传输,前面也提到了json数据传输的优势。涉及到客户端与服务器的数据交互,在服务器端,使用的是Java语言,数据以Java对象的形式使用。而浏览器客户端又能非常方便的解析JSON数据。所以开发中需要实现JSON数据和Java对象的相互转换。
客户端浏览器可以解析JS语言,支持JSON解析 。
数据转换时,我们一般不会手动获取数据,来拼接字符串, 最后转换JSON格式数据。
而是使用JSON解析器:里面封装了一些转换的工具类供我们使用。常见的解析器:Jsonlib,Gson,fastjson,jackson;
本文主要学习jackson解析器基本使用,因为jackson解析器是后期SpringMVC框架的内置解析器。
3.1 Java对象转换JSON
Java对象转换JSON,jackson的使用步骤:
- 导入jackson的相关jar包
- 创建Jackson核心对象
ObjectMapper
- 调用
ObjectMapper
的相关方法进行转换
3.2.1 ObjectMapper对象里面常用的转换方法
public void writeValue(参数1,Object obj)
:将对象obj转换为JSON字符串,并保存到参数1指定的地方,参数1有很多重载类型,这里介绍几个:- File:将obj对象转换为JSON字符串,并保存到指定的文件中
- Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
- OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
public String writeValueAsString(Object obj)
:将对象转为json字符串,并返回。
这些方法都需要异常处理。
例子:将Java中的Person对象,转换为json数据。
Person.java
public class Person {
private String name;
private int age ;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
使用JUnit单元测试,来进行转换测试,测试类:
public class JacksonTest {
//Java对象转为JSON字符串
@Test
public void test1() throws Exception {
//异常全部抛出
//1.创建Person对象
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
//2.创建Jackson的核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//3.转换
String json = mapper.writeValueAsString(p);
System.out.println(json);//{"name":"张三","age":23,"gender":"男"}
//writeValue,将数据写到d://a.txt文件中
mapper.writeValue(new File("d://a.txt"),p);
//writeValue.将数据关联到Writer中
mapper.writeValue(new FileWriter("d://b.txt"),p);
}
}
运行测试方法,控制台打印:
生成的a.txt
生成的b.txt
3.2.2 需要转换的Java对象中常用到以下两个注解
@JsonIgnore
:被该注解修饰的属性,转换JSON时会被排除。@JsonFormat
:被该注解修饰的属性,转换JSON时属性值会被格式化。如:@JsonFormat(pattern = "yyyy-MM-dd")
,pattern属性可以指定格式化的形式。
例子:将Java中的Person对象,转换为json数据。
在上述Person类中,加下下面几行代码
//@JsonIgnore // 忽略该属性
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
测试方法test2:
@Test
public void test2() throws Exception {
//1.创建Person对象
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
p.setBirthday(new Date());
//2.转换
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(p);
System.out.println(json);//{"name":"张三","age":23,"gender":"男","birthday":1530958029263}
//{"name":"张三","age":23,"gender":"男","birthday":"2018-07-07"}
}
运行测试方法,控制台打印:
如果不使用@JsonFormat
格式化注解:
这样的结果肯定不符合需求的。
3.2.3 复杂java对象转换
List和Map集合对象转换为JSON数据
- List:转换后与数组格式一致
- Map:转换后与对象格式一致
List:转换后与数组格式一致
测试方法test3:
@Test
public void test3() throws Exception {
//1.创建Person对象
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
p.setBirthday(new Date());
Person p1 = new Person();
p1.setName("张三");
p1.setAge(23);
p1.setGender("男");
p1.setBirthday(new Date());
Person p2 = new Person();
p2.setName("张三");
p2.setAge(23);
p2.setGender("男");
p2.setBirthday(new Date());
//创建List集合
List<Person> ps = new ArrayList<Person>();
ps.add(p);
ps.add(p1);
ps.add(p2);
//2.转换
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(ps);
//打印,如果集合为空,则打印[]
System.out.println(json);
}
运行测试方法,控制台打印:
[{
"name":"张三","age":23,"gender":"男","birthday":"2020-09-09"},{
"name":"张三","age":23,"gender":"男","birthday":"2020-09-09"},{
"name":"张三","age":23,"gender":"男","birthday":"2020-09-09"}]
Map:转换后与对象格式一致
测试方法test4:
@Test
public void test4() throws Exception {
//1.创建map对象
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","张三");
map.put("age",23);
map.put("gender","男");
//2.转换
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(map);
//打印一下
System.out.println(json);
}
运行测试方法,控制台输出:
{
"gender":"男","name":"张三","age":23}
3.2 JSON转为Java对象
JSON转为Java对象,不常见,了解一下,jackson的使用步骤:
- 导入jackson的相关jar包
- 创建Jackson核心对象
ObjectMapper
- 调用
ObjectMapper
的相关方法进行转换
常调用ObjectMapper方法
public <T> T readValue(String var1, Class<T> var2)
:将json字符串转换为Java对象,并返回这个对象。- 参数说明:
String var1
:需要转换的json字符串数据Class<T> var2
:转换成对象的Class对象,如Person.class
例子:测试方法test5
//演示 JSON字符串转为Java对象
@Test
public void test5() throws Exception {
//1.初始化JSON字符串
String json = "{\"gender\":\"男\",\"name\":\"张三\",\"age\":23}";
//2.创建ObjectMapper对象
ObjectMapper mapper = new ObjectMapper();
//3.转换为Java对象 Person对象
Person person = mapper.readValue(json, Person.class);
//输出打印一下
System.out.println(person);
}
运行测试方法,控制台输出:
Person{
name='张三', age=23, gender='男'}
输出了一个Person对象。
到这对JSON的应该有了基本理解。这时候就需要一个练习,加深JSON应用了,推荐看下篇博文。
推荐阅读:
【JavaWeb】AJAX和JSON案例:用户名已注册.
欢迎点赞评论,指出不足,笔者由衷感谢哦!~