Json
1、概念
- JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
- 它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,
- 采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
- 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2、语法
1、基本规则
- 数据:json数据是由键值对构成
- 键:用引号(单双都行)引起来,也可以不使用引号
- 值:
- 数字:整数或浮点数
- 字符串:在双引号中
- 逻辑值:true/false
- 数组:[]在方括号中
- 对象:{}在花括号中
- null:
- 数据有逗号分割:多个键值对由逗号分割
- 花括号保存对象:使用{}定义json格式
- 方括号保存数组:[]
定义json的三种方式
//1、定义基本格式
var person = {"name":"张三",age:23,'gender':true};
//2、嵌套:{[]}
var persons = {
"person":[
{"name":"张三",age:23,'gender':true},
{"name":"张三",age:23,'gender':true},
{"name":"张三",age:23,'gender':true}
]
};
//3、嵌套:[{}]
var ps = [
{"name":"张三",age:23,'gender':true},
{"name":"张三",age:23,'gender':true},
{"name":"张三",age:23,'gender':true}
];
2、获取数据
1、json对象.键名
var person = {"name":"张三",age:23,'gender':true};
var name = person.name;
var names = person["name"];
2、json对象[“键名”]
var person = {"name":"张三",age:23,'gender':true};
var names = person["name"];
3、数组对象[索引]
var persons = {
"person":[
{"name":"张三",age:23,'gender':true},
{"name":"张三",age:23,'gender':true},
{"name":"张三",age:23,'gender':true}
]
};
var age = persons.person[2].age;
var ps = [
{"name":"张三",age:23,'gender':true},
{"name":"张三",age:23,'gender':true},
{"name":"张三",age:23,'gender':true}
];
var gender = ps[0].gender;
3、遍历获取
<script>
//1、定义基本格式
var person = {"name":"张三",age:23,'gender':true};
for(var key in person){
alert(key+":"+person[key]);
}
//嵌套:{[]}
var persons = {
"person":[
{"name":"张三",age:23,'gender':true},
{"name":"张4",age:56,'gender':false},
{"name":"张5",age:73,'gender':true}
]
};
for (var m=0;m<persons.person.length;i++){
var n = persons.person[m];
for(var key in n){
alert(key+":"+n[key]);
}
}
//嵌套:[{}]
var ps = [
{"name":"张三",age:23,'gender':true},
{"name":"张6",age:93,'gender':true},
{"name":"张8",age:20,'gender':false}
];
for(var i=0;i<ps.length;i++){
var p = ps[i];
for (var key in p){
alert(key+":"+p[key]);
}
}
</script>
3、json与java对象的相互转化
json解析器:
- Jsonlib
- Gson
- fastjson
- jackson
1、Json转为Java对象
1、导入Jackson的相关的jar包
2、创建Jackson核心对象ObjectMapper
ObjectMapper mapper = new ObjectMapper();
3、调用ObjectMapp的相关方法进行转换
readValue(json字符串,Class)
@Test
public void testJsonToJava() throws IOException {
//1、创建一个json字符串
String json = " {\"name\":\"yangyang\",\"age\":18,\"gender\":\"女\",\"birthday\":\"2021-06-19\"}";
//2、创建一个Jack核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//调用readValue();转换
User user = mapper.readValue(json, User.class);
System.out.println(user);//User{name='yangyang', age=18, gender='女'}
}
2、Java对象转Json
1、使用步骤
1、导入Jackson的相关的jar包
和json转java对象的jar一样
2、创建Jackson核心对象ObjectMapper
ObjectMapper mapper = new ObjectMapper();
3、调用ObjectMapper的相关方法进行转化
writeValue(参数1,obj);
参数1
File:将obj对象转为JSON字符串,并保存到指定的文件中
writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
OutputStream:将obj对象转化为JSON字符串,并将数据填充到字节输出流中
mapper.writeValueAsString(obj):将java对象转为json字符串
代码
/**
* java转Json
*/
public class JavaToJson {
@Test
public void testJavaToJson() throws IOException {
--------------------------------//1、创建User对象------------------------------
User user = new User();//User是一个javaBean对象
user.setName("yangyang");
user.setAge(18);
user.setGender("女");
----------------------//2、创建Jack的核心对象 ObjectMapper----------------------
ObjectMapper mapper = new ObjectMapper();
--------------------------------//3、转化--------------------------------------
/**
*writeValue(参数,obj);
* 参数1
* File:将obj对象转为JSON字符串,并保存到指定的文件中
* writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
* OutputStream:将obj对象转化为JSON字符串,并将数据填充到字节输出流中
* mapper.writeValueAsString(obj):将java对象转为json字符串
*/
--------------------------方式一--------------------------
String json = mapper.writeValueAsString(user);
//{"name":"yangyang","age":18,"gender":"女"}
System.out.println(json);
-----------------------方式二----------------------------
//writeValue();将数据写到a.txt文件中
mapper.writeValue(new File("E://a.txt"),user);
-----------------------方式三----------------------------
//writeValue,将数据关联到writer中
mapper.writeValue(new File("E://b.txt"),user);
}
}
效果
2、注解:
- birthday什么注解也不加
//{"name":"yangyang","age":18,"gender":"女","birthday":1624072760458}
private Date birthday;
- @JsonIgnore:排除属性
//{"name":"yangyang","age":18,"gender":"女"}
@JsonIgnore//忽略该属性
private Date birthday;
- JsonFormat:属性值得格式化
//{"name":"yangyang","age":18,"gender":"女","birthday":"2021-06-19"}
@JsonFormat(pattern = "yyyy-MM-dd")//格式化
private Date birthday;
3、复杂的java对象转换
- List集合--------->数组格式
/**
* list集合------->json
* @throws IOException
*/
@Test
public void testJavaToJson3() throws IOException {
//1、创建User对象
User user = new User();
user.setName("yangyang");
user.setAge(13);
user.setGender("女");
user.setBirthday(new Date());
User user2 = new User();
user2.setName("xoxo");
user2.setAge(16);
user2.setGender("女");
user2.setBirthday(new Date());
User user3 = new User();
user3.setName("xixi");
user3.setAge(18);
user3.setGender("女");
user3.setBirthday(new Date());
//创建List对象
List<User> list = new ArrayList<User>();
list.add(user);
list.add(user2);
list.add(user3);
//2、创建Jack的核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//3、转换
/**
* [
* {"name":"yangyang","age":18,"gender":"女","birthday":"2021-06-19"},
* {"name":"yangyang","age":18,"gender":"女","birthday":"2021-06-19"},
* {"name":"yangyang","age":18,"gender":"女","birthday":"2021-06-19"}
* ]
*/
String json = mapper.writeValueAsString(list);
System.out.println(json);
}
- Map集合-------->对象格式
/**
* Map集合---------->json
* @throws IOException
*/
@Test
public void testJavaToJson4() throws IOException {
//创建Map集合
Map<String, Object> map = new HashMap<>();
map.put("name","yangyang");
map.put("age",28);
map.put("gender","女");
map.put("birthday",new Date());
//2、创建Jack的核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//3、转换
//{"birthday":1624075834853,"gender":"女","name":"yangyang","age":28}
String json = mapper.writeValueAsString(map);
System.out.println(json);
}
4、用户名校验
注意:在服务器响应的数据,在客户端使用时,要想当作json数据使用由两种方法
-
$.get(type):将最后一个参数type指定为”json“
-
//在服务器端设置MIME类型:json resp.setContentType("application/json;charset=utf-8");
客户端代码
<script> $(function () { //给name绑定blur(失去焦点)事件 $("#username").blur(function () {//鼠标失去焦点 //获取文本框的输入的值 var username = $(this).val(); //发送异步请求 $.get( "findUserServlet", {username:username}, function (data) { //期望服务器响应回的数据格式: //{"userExsit":true,"msg":"用户名太受欢迎,请更换!!!"} //{"userExsit":false,"msg":"用户名可用"}; var span = $("#s_username"); if(data.userExsit){ //用户名 存在 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"><br> <span id="s_username"></span><br> <input type="password" id="pass" name="password"><br> <input type="submit" value="注册"><br> </form> </body>
服务器端代码
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置响应格式为json resp.setContentType("application/json;charset=utf-8"); Map<String, Object> map = new HashMap<>(); //获取用户名 String username = req.getParameter("username"); //期望服务器响应回的数据格式: //{"userExsit":true,"msg":"用户名太受欢迎,请更换!!!"} //{"userExsit":false,"msg":"用户名可用"}; if(username.equals("yangyang")){ map.put("userExsit",true); map.put("msg","此用户太受欢迎,请更换一个"); }else{ map.put("userExsit",false); map.put("msg","用户名可用"); } //将map集合转为json ObjectMapper mapper = new ObjectMapper(); mapper.writeValue( resp.getWriter(),map); }