Json
一、简介
JSON(JavaScript Object Notation, JS 对象标记) 是⼀种轻量级的数据交换格式。它基于ECMAScript的⼀个⼦集,采⽤完全独⽴于编程语⾔的⽂本格式来存储和表示数据。简洁和清晰的层次结构使得JSON 成为理想的数据交换语⾔。易于⼈阅读和编写,同时也易于机器解析和⽣成,并有效地提升⽹络传输效率。
二、语法
JSON对象的语法有三种:对象、数组、混合模式
三、书写规范
1、使⽤{}和[]书写,{}表示对象类型,[]表示数组类型
2、.对象类型中每组数据之间⽤逗号隔开,每组中的关键字与值之间⽤冒号隔开
3、数组类型中每个值之间⽤逗号隔开,最后⼀个值后⾯不要加逗号
四、工具介绍
1、JSON在线解析⼯具:http://www.bejson.com/
作⽤:
1.校验JSON数据的语法是否正确
2.将不规范的JSON格式数据进⾏格式化
2、常⻅的json转换⼯具
json的转换⼯具是通过java封装好的⼀些jar⼯具包,直接将java对象或集合转换成json格式的字符串。
五、应用
-
Jackson使用:
- 导⼊json相关jar包
-
创建java对象或集合
-
使⽤jackson的ObjectMapper对象的writeValueAsString⽅法进⾏转换
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ujiuye.pojo.User;
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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@WebServlet("/jackson")
public class jackson extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//创建User对象
User user = new User();
user.setUid(1001);
user.setUsername("柳岩");
user.setPassword("123");
//创建List集合
List<String> list = new ArrayList<>();
list.add("Java研发⼯程师");
list.add("web前端⼯程师");
list.add("UI设计师");
//创建Map集合
Map<String, User> map = new HashMap<>();
map.put("user", user);
//转换json
ObjectMapper mapper = new ObjectMapper();
String userJson = mapper.writeValueAsString(user);
String listJson = mapper.writeValueAsString(list);
String mapJson = mapper.writeValueAsString(map);
System.out.println(userJson);
System.out.println(listJson);
System.out.println(mapJson);
}}
六、案例
案例需求: 搜索框⾃动补全
在输⼊框输⼊关键字,下拉框中异步显示与该关键字相关的数据
jsp代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<style type="text/css">
* {
margin: 0px;
padding: 0px;
}
#box {
display: inline-block;
}
#search {
width: 545px;
height: 42px;
border-color: #4E6EF2;
border-top-left-radius: 10px;
border-bottom-left-radius: 10px;
float: left;
}
#btn {
width: 108px;
height: 42px;
background-color: #4e6ef2;
color: #fff;
border: none;
font-size: 17px;
font-weight: 400;
border-top-right-radius: 10px;
border-bottom-right-radius: 10px;
float: left;
}
#show {
width: 545px;
border: 1px solid #4e6ef2;
position: relative;
left: -55px;
text-align: left;
}
</style>
<script src="./js/jquery-3.3.1.js"></script>
<script>
$(function(){
//绑定键盘弹起事件
$("#search").bind('input porpertychange',function(){
//获取输⼊框的值
var word = $(this).val();
//判断不为空
if(word != ""){
console.log(word)
//发送ajax请求
$.ajax({
url:"searchWord",
data:{"word":word},
type:"post",
dataType:"json",
success:function(obj){
var htmlStr = "";
for(var i = 0; i < obj.length; i++){
//console.log(obj[i].sname)
htmlStr += "<div>"+obj[i].sname+"</div>";
}
$("#show").html(htmlStr).show();
}
})
}else{
$("#show").hide();
}
})
})
</script>
</head>
<body>
<center>
<img alt="" width="310" height="150"
src="${pageContext.request.contextPath }/img/baidu.png"><br/>
<div id="box">
<input id="search" type="text" name="search"/>
<button id="btn">百度⼀下</button>
</div>
<div id="show">
</div>
</center>
</body>
</html>
- Servlet代码
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ujiuye.pojo.Student;
import com.ujiuye.service.SearchService;
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.List;
@WebServlet("/searchWord")
public class SearchWordServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取word值
String word = request.getParameter("word");
//业务处理
SearchService ss = new SearchService();
List<Student> sList = ss.searchWord(word);
//判断
if(sList != null && sList.size() > 0){
//将集合转换成json
ObjectMapper mapper = new ObjectMapper();
String strJson = mapper.writeValueAsString(sList);
System.out.println(strJson);
//响应⻚⾯
response.getWriter().write(strJson);
}}}
- Service层
package com.ujiuye.service;
import com.ujiuye.dao.SearchDao;
import com.ujiuye.pojo.Student;
import java.util.List;
public class SearchService {
public List<Student> searchWord(String word) {
SearchDao sd = new SearchDao();
return sd.searchWord(word);
}}
- Dao层
import com.ujiuye.pojo.Student;
import com.ujiuye.utils.C3P0Utils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.List;
public class SearchDao {
public List<Student> searchWord(String word) {
try {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
String sql = "select * from student where sname like ?";
List<Student> sList = qr.query(sql, new BeanListHandler<Student>(Student.class),
"%"+word+"%");
return sList;
} catch (SQLException e) {
e.printStackTrace();
}
return null; }
}
- 效果
七、转Jason格式工具类
工具类一
(对象转jason、Jason转对象)
package com.offcn.utils;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonUtils {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 将对象转换成json字符串。
* <p>Title: entityToJson</p>
* <p>Description: </p>
* @param data
* @return
*/
public static String objectToJson(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 将json结果集转化为对象
*
* @param jsonData json数据
* @param clazz 对象中的object类型
* @return
*/
public static <T> T jsonToEntity(String jsonData, Class<T> beanType) {
try {
T t = MAPPER.readValue(jsonData, beanType);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将json数据转换成entity对象list
* <p>Title: jsonToList</p>
* <p>Description: </p>
* @param jsonData
* @param beanType
* @return
*/
public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List<T> list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
工具类二
对象转jason
package com.chenshuang.utils;
import com.chenshuang.entity.ResultVo;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.http.HttpServletResponse;
public class ObjToJson {
public static String objToJson(ResultVo vo, HttpServletResponse response) {
try {
// 1、创建核心对象
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(vo);
response.setContentType("text/html;charset=utf-8");
return json;
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
XML
一、简介
XML 指可扩展标记语⾔(EXtensible Markup Language),是⼀种标记语⾔,很类似 HTML,设计宗旨是传输数据,⽽⾮显示数据。标签没有被预定义。您需要⾃⾏定义标签。
二、语法
1、⽂档声明:
<?xml version="1.0" encoding="UTF-8"?>2、⾃定义标签:
<根标签>
<⼦标签 属性=“值”>内容</⼦标签>
<⼦标签 属性=“值”>内容</⼦标签>
…
</根标签>
三、约束
DTD(⽂档类型定义)的作⽤是定义 XML ⽂档的合法构建模块。
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to+,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>xx</to>
<to></to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
XML Schema 是基于 XML 的 DTD 替代者,XML Schema 描述 XML ⽂档的结构。
student.xsd⽂件:
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.ujiuye.com"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ujiuye.com" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<xsd:simpleType name="sexType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
student.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!--
1、编写根标签
2、引⼊实例名称空间 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3、引⼊名称空间 xsi:schemaLocation="http://www.ujiuye.cn/xml student.xsd"
4、引⼊默认的名称空间
-->
<students
xmlns="http://www.ujiuye.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.ujiuye.com student.xsd"
>
<student number="1111">
<name>tom</name>
<age>111</age>
<sex>male</sex>
</student>
</students>