一、什么是数据交换格式
客户端与服务器常用数据交换格式xml、json、html
一、 数据交换格式用场景
Xml:先不流行,因为xml是重量级的,占宽带比较大。所以在传输中效率并不高,
Webservice、xml银行老项目。
Json:轻量级,json占宽带比较小,所以他在传输中比xml高。
移动端(安卓、IOS)通讯方式采用http协议+JSON格式走restful风格。
很多互联网项目都采用Http协议+JSON
因为xml比较重WebService服务采用http+xml格式银行项目使用比较多
Json与jsonp的区别?
Json是数据格式传入,jsonp是跨域用的,jsonp有个缺点,只能用get请求。
1.1JSON简单使用
1.1.1.什么是JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过JSON来进行交换。
JSON
:JavaScript 对象表示法(J
avaS
cript O
bject N
otation)。
JSON
的形式是用大括号“{}”
包围起来的项目列表,每一个项目间用逗号(,)分隔,而项目就是用冒号(:)分隔的属性名和属性值。这是典型的字典表示形式,也再次表明javascript
里的对象就是字典结构。不管多么复杂的对象,都可以用一句JSON
代码来创建并赋值。在JSON
中,名称 / 值对包括字段名称(在双引号中),后面写一个冒号,然后是值
4.1.2.JSON格式的分类
JSON有两种结构
json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构
1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象.key 获取属性值,这个属性值的类型可以是数字、字符串、数组、对象几种。
2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象几种。
经过对象、数组2种结构就可以组合成复杂的数据结构了。
.常用JSON解析框架
fastjson(阿里)、gson(谷歌)、jackson(SpringMVC自带)
4.1.4.使用fastjson解析json
添加jarfastjson-1.1.43 或引入maven依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.43</version> </dependency> |
4.1.5.使用fastjsonapi
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray |
package com.itmayiedu;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
public class JSONTest {
public static void main(String[] args) {
// setJSON();
// setFastJSON();
// setMapToJSON();
// setBeanToJSON();
// analysisJson();
// jsonToBean();
gsonTest();
}
/**
* 通过传统方式自己拼接字符串JSON
*/
public static void setJSON() {
String str = " { \"errorCode\": \"0\",\"errorMsg\": \"调用接口成功\",\"data\": [{\"userName\": \"余胜军\",\"position\": \"蚂蚁课堂创始人\",\"webAddres\": \"www.itmayiedu.com\" }, { \"userName\": \"周安旭\", \"position\": \"蚂蚁课堂合伙人\", \"webAddres\": \"www.itmayiedu.com\" } ]}";
System.out.println(str);
}
/**
* 通过fastJSON封装JSON
*/
public static void setFastJSON() {
JSONObject root = new JSONObject();
root.put("errorCode", 0);
root.put("errorMsg", "调用接口成功");
JSONArray dataArr = new JSONArray();
JSONObject userYushengjun = new JSONObject();
userYushengjun.put("userName", "余胜军");
userYushengjun.put("position", "蚂蚁课堂创始人");
userYushengjun.put("webAddres", "www.itmayiedu.com");
dataArr.add(userYushengjun);
root.put("data", dataArr);
System.out.println(root.toJSONString());
}
/**
* 通过map转换成json
*/
static public void setMapToJSON() {
HashMap<String, Object> root = new HashMap<String, Object>();
root.put("errorCode", 0);
root.put("errorMsg", "调用接口成功");
List<Map<String, String>> dataArr = new ArrayList<Map<String, String>>();
Map<String, String> userYushengjun = new HashMap<String, String>();
userYushengjun.put("userName", "余胜军");
userYushengjun.put("position", "蚂蚁课堂创始人");
userYushengjun.put("webAddres", "www.itmayiedu.com");
Map<String, String> itmayiedu = new HashMap<String, String>();
itmayiedu.put("userName", "余胜军1");
itmayiedu.put("position", "蚂蚁课堂创始人1");
itmayiedu.put("webAddres", "www.itmayiedu.com");
dataArr.add(itmayiedu);
dataArr.add(userYushengjun);
root.put("data", dataArr);
System.out.println(new JSONObject().toJSONString(root));
}
/**
* 通过实体类转换JSON
*/
static public void setBeanToJSON() {
RootEntity rootEntity = new RootEntity();
rootEntity.setErrorCode("0");
rootEntity.setErrorMsg("调用接口成功");
List<UserEntity> data = new ArrayList<UserEntity>();
UserEntity userEntity = new UserEntity();
userEntity.setPosition("蚂蚁课堂创始人");
userEntity.setUserName("余胜军");
userEntity.setWebAddres("itmayiedu.com");
data.add(userEntity);
rootEntity.setData(data);
System.out.println(new JSONObject().toJSONString(rootEntity));
}
/**
* 解析JSON
*/
static public void analysisJson() {
String jsonStr = "{ \"errorCode\": \"0\",\"errorMsg\": \"调用接口成功\",\"data\": [{\"userName\": \"余胜军\",\"position\": \"蚂蚁课堂创始人\",\"webAddres\": \"www.itmayiedu.com\" }, { \"userName\": \"周安旭\", \"position\": \"蚂蚁课堂合伙人\", \"webAddres\": \"www.itmayiedu.com\" } ]}";
// 将json字符串转换成json
JSONObject root = new JSONObject().parseObject(jsonStr);
String errorCode = root.getString("errorCode");
String errorMsg = root.getString("errorMsg");
System.out.println("errorCode:" + errorCode + ",errorMsg:" + errorMsg);
JSONArray dataArr = root.getJSONArray("data");
for (int i = 0; i < dataArr.size(); i++) {
JSONObject dataBean = (JSONObject) dataArr.get(i);
String position = dataBean.getString("position");
String userName = dataBean.getString("userName");
String webAddres = dataBean.getString("webAddres");
System.out.println("position:" + position + ",userName:" + userName + ",webAddres:" + webAddres);
}
}
/**
* 通过JSON转实体类
*/
static public void jsonToBean() {
String jsonStr = "{ \"errorCode\": \"0\",\"errorMsg\": \"调用接口成功\",\"data\": [{\"userName\": \"余胜军\",\"position\": \"蚂蚁课堂创始人\",\"webAddres\": \"www.itmayiedu.com\" }, { \"userName\": \"周安旭\", \"position\": \"蚂蚁课堂合伙人\", \"webAddres\": \"www.itmayiedu.com\" } ]}";
// 将json字符串转换成json
RootEntity rootEntity = new JSONObject().parseObject(jsonStr, RootEntity.class);
System.out.println(rootEntity.toString());
}
/**
* gson五分钟快速入门
*/
static public void gsonTest() {
Gson gson = new Gson();
RootEntity rootEntity = new RootEntity();
rootEntity.setErrorCode("0");
rootEntity.setErrorMsg("调用接口成功");
List<UserEntity> data = new ArrayList<UserEntity>();
UserEntity userEntity = new UserEntity();
userEntity.setPosition("蚂蚁课堂创始人");
userEntity.setUserName("余胜军");
userEntity.setWebAddres("itmayiedu.com");
data.add(userEntity);
rootEntity.setData(data);
// 实体类转换成json
String json = gson.toJson(rootEntity);
System.out.println("json:" + gson.toJson(rootEntity));
RootEntity rty = gson.fromJson(json, RootEntity.class);
System.out.println(rty.toString());
}
}
JSON与XML面试题解析
什么是JSON 、XML?
XML:记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java,JavaScript, Perl, Python等)体系的行为。这些特性使JSON成为理想的数据交换语言。
JSON基于JavaScript Programming Language , Standard ECMA-262 3rd Edition- December 1999 的一个子集。
一句话总结:JSON和XML都是数据交换格式,JSON轻量级的数据交换格式、XML标记电子文件使其具有结构性的标记语言。
JSON与XML区别是什么? 有什么共同点?
一句话总结:JSON轻量级的数据交换格式、XML标记电子文件使其具有结构性的标记语言。
1).XML的优缺点
<1>.XML的优点
A.格式统一,符合标准;
B.容易与其他系统进行远程交互,数据共享比较方便。
<2>.XML的缺点
A.XML文件庞大,文件格式复杂,传输占带宽;
B.服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;
C.客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;
D.服务器端和客户端解析XML花费较多的资源和时间。
(2).JSON的优缺点
<1>.JSON的优点:
A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
C.支持多种语言,包括ActionScript, C, C#,ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;
D.在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;
E.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
<2>.JSON的缺点
A.没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;
B.JSON格式目前在Web Service中推广还属于初级阶段。
一句话总结:XML它是用于RPC远程调用数据交换格式,因为XML文件格式复杂,比较占宽带,不易于维护,服务器端与客户端解析xml话费较多的资源和时间.
JSON它是用于RPC远程调用数据交换格式,因为JSON文件格式压缩,占宽带小,易于维护。
为什么用JSON不用XML?
json是轻量级,xml是重量级。因为xml是重量级的,文件格式复杂,所以在远程调用时,比较占宽带。json因为是轻量级,文件格式都是压缩的,占宽带小。
JSON、XML解析有那些方式?
JSON解析方式(阿里巴巴fastjson、谷歌gson,jackJson)
XML解析方式(dom、sax、pul)
哪里说一下JSON、XML你是在哪里用的?
这个就更具大家实际开发经验来说。
例如:一般现在移动APP接口都采用JSON,因为json占宽带小。
例如:我们公司微信开发,微信接口都是JSON格式的, 微信事件推送是XML。
JSON和XML都是在远程调用或者是和某公司合作定义数据交换格式。
4.2.1什么是XML?
它是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言。
XML 全称为可扩展的标记语言。主要用于描述数据和用作配置文件。
XML 文档在逻辑上主要由一下 5 个部分组成:
XML 声明:指明所用 XML 的版本、文档的编码、文档的独立性信息
文档类型声明:指出 XML 文档所用的 DTD
元素:由开始标签、元素内容和结束标签构成
注释:以结束,用于对文档中的内容起一个说明作用
处理指令:通过处理指令来通知其他应用程序来处理非 XML 格式的数据,格式为
XML 文档的根元素被称为文档元素,它和在其外部出现的处理指令、注释等作为文档实体的子节点,根元素本身和其内部的子元素也是一棵树。
4.2.2 XML样例?
<?xml version="1.0"encoding="UTF-8"?>
<students>
<student1 id="001">
<微信公众号>@残缺的孤独</微信公众号>
<学号>20140101</学号>
<地址>北京海淀区</地址>
<座右铭>要么强大,要么听话</座右铭>
</student1>
<student2 id="002">
<新浪微博>@残缺的孤独</新浪微博>
<学号>20140102</学号>
<地址>北京朝阳区</地址>
<座右铭>在哭泣中学会坚强</座右铭>
</student2>
</students><?xml version="1.0"encoding="UTF-8"?>作用
xml文件头部要写的话,说明了xml的版本和编码,utf-8一般是网络传输用的编码
4.2.3XML解析方式?
Dom4j、Sax、Pull
4.2.3Dom4j与Sax区别
dom4j不适合大文件的解析,因为它是一下子将文件加载到内存中,所以有可能出现内存溢出,sax是基于事件来对xml进行解析的,所以他可以解析大文件的xml,也正是因为如此,所以dom4j可以对xml进行灵活的增删改查和导航,而sax没有这么强的灵活性,所以sax经常是用来解析大型xml文件,而要对xml文件进行一些灵活(crud)操作就用dom4j。
4.2.4 使用dom4j解析xml
解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:
1.自己创建Document对象
Documentdocument = DocumentHelper.createDocument(); Element root = document.addElement("students"); |
其中students是根节点,可以继续添加其他节点等操作。
2.自己创建Document对象
// 创建SAXReader对象 SAXReaderreader = newSAXReader(); // 读取文件转换成Document Documentdocument = reader.read(newFile("XXXX.xml")); |
3.读取XML文本内容获取Document对象
String xmlStr = "<students>......</students>"; Documentdocument = DocumentHelper.parseText(xmlStr); |
4.2.5解析xml代码
Xml配置:
<?xmlversion="1.0"encoding="UTF-8"?> <students> <student1id="001"> <微信公众号>@残缺的孤独</微信公众号> <学号>20140101</学号> <地址>北京海淀区</地址> <座右铭>要么强大,要么听话</座右铭> </student1> <student2id="002"> <新浪微博>@残缺的孤独</新浪微博> <学号>20140102</学号> <地址>北京朝阳区</地址> <座右铭>在哭泣中学会坚强</座右铭> </student2> </students> |
Java代码
publicstaticvoid main(String[] args) throwsDocumentException { SAXReadersaxReader = newSAXReader(); Document read = saxReader.read(new File("E://work//spring-ioc//src//main//resources//stu.xml")); // 获取根节点 Element rootElement = read.getRootElement(); getNodes(rootElement);
}
staticpublicvoidgetNodes(Element rootElement) { System.out.println("当前节点名称:" + rootElement.getName()); // 获取属性ID List<Attribute>attributes = rootElement.attributes(); for (Attribute attribute : attributes) { System.out.println("属性:" + attribute.getName() + "---" + attribute.getText()); } if (!rootElement.getTextTrim().equals("")) { System.out.println(rootElement.getName() + "--" + rootElement.getText()); } // 使用迭代器遍历 Iterator<Element>elementIterator = rootElement.elementIterator(); while (elementIterator.hasNext()) { Element next = elementIterator.next(); getNodes(next); }
} |
注意:
this.getClass().getClassLoader().getResourceAsStream(xmlPath)获取当前项目路径xmlfsfs
4.2XML与JSON区别
Xml是重量级数据交换格式,占宽带比较大。
JSON是轻量级交换格式,xml占宽带小。
所有很多互联网公司都会使用json作为数据交换格式
很多银行项目,大多数还是在使用xml。
一、 Java反射机制
5.1 什么是Java反射
就是正在运行,动态获取这个类的所有信息。
5.2反射机制的作用
1,反编译:.class-->.java
2.通过反射机制访问java对象的属性,方法,构造方法等;
5.3反射机制的应用场景
Jdbc加载驱动-----
Spring ioc
框架
5.4反射机制获取类有三种方法
//第一种方式:
Classc1= Class.forName("Employee");
//第二种方式:
//java中每个类型都有class 属性.
Classc2= Employee.class;
//第三种方式:
//java语言中任何一个java对象都有getClass方法
Employeee= newEmployee();
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)5.5反射创建对象的方式
Class<?>forName = Class.forName("com.itmayiedu.entity.User"); // 创建此Class 对象所表示的类的一个新实例调用了User的无参数构造方法. Object newInstance = forName.newInstance(); |
实例化有参构造函数
Class<?>forName = Class.forName("com.itmayiedu.entity.User"); Constructor<?>constructor = forName.getConstructor(String.class, String.class); User newInstance = (User) constructor.newInstance("123", "123"); |
5.6反射创建api
方法名称 | 作用 |
getDeclaredMethods[] | 获取该类的所有方法 |
getReturnType() | 获取该类的返回值 |
getParameterTypes() | 获取传入参数 |
getDeclaredFields() | 获取该类的所有字段 |
setAccessible | 允许访问私有成员 |
5.7使用反射为类私有属性赋值
// 获取当前类class地址 Class<?>forName = Class.forName("com.itmayiedu.entity.User"); // 使用反射实例化对象无参数构造函数 Object newInstance = forName.newInstance(); // 获取当前类的userId字段 Field declaredField = forName.getDeclaredField("userId"); // 允许操作私有成员 declaredField.setAccessible(true); // 设置值 declaredField.set(newInstance, "123"); User user = (User) newInstance; System.out.println(user.getUserId()); |
思考题?
我们不用new怎么创建对象?
类的私有成员,真的可以不能被访问吗?
反射
使用反射技术创建对象和new那个效率高? new 效率高。
package com.itmayiedu.classFrorm;
import java.lang.reflect.Field;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.itmayiedu.entity.UserEntity;
public class ClassPathXmlApplicationContext {
private String xmlPath;
public ClassPathXmlApplicationContext(String xmlPath) {
this.xmlPath = xmlPath;
}
public Object getBean(String beanId) throws DocumentException, ClassNotFoundException, NoSuchFieldException,
SecurityException, IllegalArgumentException, IllegalAccessException, InstantiationException {
// spring 加载过程 或者spring ioc实现原理
// 1.读取xml配置文件
// 获取xml解析器
SAXReader saxReader = new SAXReader();
// this.getClass().getClassLoader().getResourceAsStream("xmlPath")
// 获取当前项目路径
Document read = saxReader.read(this.getClass().getClassLoader().getResourceAsStream(xmlPath));
// 获取跟节点对象
Element rootElement = read.getRootElement();
List<Element> elements = rootElement.elements();
Object obj = null;
for (Element sonEle : elements) {
// 2.获取到每个bean配置 获取class地址
String sonBeanId = sonEle.attributeValue("id");
if (!beanId.equals(sonBeanId)) {
continue;
}
String beanClassPath = sonEle.attributeValue("class");
// 3.拿到class地址 进行反射实例化对象 ,使用反射api 为私有属性赋值
Class<?> forName = Class.forName(beanClassPath);
obj = forName.newInstance();
// 拿到成员属性
List<Element> sonSoneleme = sonEle.elements();
for (Element element : sonSoneleme) {
String name = element.attributeValue("name");
String value = element.attributeValue("value");
// 使用反射api 为私有属性赋值
Field declaredField = forName.getDeclaredField(name);
//运行往私有成员赋值
declaredField.setAccessible(true);
declaredField.set(obj, value);
}
}
// 3.拿到class地址 进行反射实例化对象 ,使用反射api 为私有属性赋值
return obj;
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException,
IllegalArgumentException, IllegalAccessException, InstantiationException, DocumentException {
ClassPathXmlApplicationContext appLication = new ClassPathXmlApplicationContext("user.xml");
Object bean = appLication.getBean("user1");
UserEntity user = (UserEntity) bean;
System.out.println(user.getUserId() + "----" + user.getUserName());
}
}
6.1什么是SpringIOC
什么是SpringIOC,就是把每一个bean(实体类)与bean(实体了)之间的关系交给第三方容器进行管理。
把每个bean与bean之间的关系,都交给了第三方容器(spring)管理。
我们是spring的时候,对象不需要new.
Spring原理就是使用反射+dom4j。
Spring的加载过程或者springioc实现原理?
1、 读取xml配置文件。
2、 获取每个bean配置,获取class地址。
3、 拿到class地址,进行反射实例化对象,使用反射api为私有属性赋值。
Xml配置:
<beans> <beanid="user1"class="com.itmayiedu.entity.UserEntity"> <propertyname="userId"value="0001"></property> <propertyname="userName"value="余胜军"></property> </bean> <beanid="user2"class="com.itmayiedu.entity.UserEntity"> <propertyname="userId"value="0002"></property> <propertyname="userName"value="张三"></property> </bean> </beans> |
Java代码:
//1.读取springxml配置 ClassPathXmlApplicationContextclassPathXmlApplicationContext = newClassPathXmlApplicationContext( "applicationContext.xml"); //2.获取bean对象 TestServicetestService = (TestService) classPathXmlApplicationContext.getBean("testService"); System.out.println(testService.test());
|
6.2什么是SpringIOC底层实现原理
1.读取bean的XML配置文件
2.使用beanId查找bean配置,并获取配置文件中class地址。
3.使用Java反射技术实例化对象
4.获取属性配置,使用反射技术进行赋值。