1 数据交换格式
数据交换格式(报文/参数列表),就是客户端与服务器常用的数据交换格式xml,json,html等,常用于面向接口开发。
json:一种轻量级数据交换格式。移动端(安卓、IOS)通讯方式采用http协议+JSON格式 走restful风格。很多互联网项目都采用Http协议+JSON。占用宽带小
xml:可扩展的标记语言,重量级交换格式。因为xml比较重WebService服务采用http+xml格式 银行项目使用比较多。
1.1 json
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过JSON来进行交换。
样例:
{ "id": "10", "name": "课程", "items": [ { "itemId": "20", "itemName": 数学" }, { "itemId": "21", "itemName": "化学" } ] } |
JSON
:JavaScript 对象表示法(J
avaS
cript O
bject N
otation)。
JSON
的形式是用大括号“{}”
包围起来的项目列表,每一个项目间用逗号(,)分隔,而项目就是用冒号(:)分隔的属性名和属性值。这是典型的字典表示形式,也再次表明javascript
里的对象就是字典结构。不管多么复杂的对象,都可以用一句JSON
代码来创建并赋值。在JSON
中,名称 / 值对包括字段名称(在双引号中),后面写一个冒号,然后是值
1.1.1 分类
1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
经过对象、数组2种结构就可以组合成复杂的数据结构了。
1.1.2 常用JSON解析框架
fastjson(阿里)、gson(谷歌)、jackson(SpringMVC自带)
1.1.2.1 fastjson解析json
添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.43</version>
</dependency>
常用api:
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。
例子:
public class FastJsonDemo {
//json字符串
static String json="{\"id\":\"10\",\"name\":\"课程\",\"items\":[{\"itemId\":\"20\",\"itemName\":\"数学\"},{\"itemId\":\"21\",\"itemName\":\"化学\"}]}";
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject().parseObject(json);
String id = jsonObject.getString("id");
System.out.println("id:"+id);
String name = jsonObject.getString("name");
System.out.println("name:"+name);
JSONArray items = jsonObject.getJSONArray("items");
for (int i = 0; i < items.size(); i++) {
JSONObject jsonObject1 = items.getJSONObject(i);
String itemId=jsonObject1.getString("itemId");
String itemName=jsonObject1.getString("itemName");
System.out.println("itemId:"+itemId+",itemName:"+itemName);
}
}
}
输出:
id:10
name:课程
itemId:20,itemName:数学
itemId:21,itemName:化学
1.1.2.2 Json转对象
@Data
class Course{
private String id;
private String name;
private List<Item> items;
@Override
public String toString() {
return "Course{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", items=" + items +
'}';
}
}
@Data
class Item{
private String itemId;
private String itemName;
@Override
public String toString() {
return "Item{" +
"itemId='" + itemId + '\'' +
", itemName='" + itemName + '\'' +
'}';
}
}
public class FastJsonDemo2 {
static String json="{\"id\":\"10\",\"name\":\"课程\",\"items\":[{\"itemId\":\"20\",\"itemName\":\"数学\"},{\"itemId\":\"21\",\"itemName\":\"化学\"}]}";
public static void main(String[] args) {
Course course = new JSONObject().parseObject(json,Course.class);//json转对象
System.out.println(course.toString());
}
}
输出:
Course{id='10', name='课程', items=[Item{itemId='20', itemName='数学'}, Item{itemId='21', itemName='化学'}]}
1.1.2.3 组装Json
public class Test01 {
public static void main(String[] args) {
JSONObject root=new JSONObject();
root.put("id","20");
root.put("name","课程");
JSONArray jsonArray=new JSONArray();
JSONObject jsonObject=new JSONObject();
jsonObject.put("itemId","20");
jsonObject.put("itemName","数学");
JSONObject jsonObject2=new JSONObject();
jsonObject2.put("itemId","21");
jsonObject2.put("itemName","化学");
jsonArray.add(jsonObject);
jsonArray.add(jsonObject2);
root.put("items",jsonArray);
System.out.println(root.toJSONString());
}
}
输出:
{"id":"20","items":[{"itemId":"20","itemName":"数学"},{"itemId":"21","itemName":"化学"}],"name":"课程"}
1.2 xml
它是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言。XML 全称为可扩展的标记语言。主要用于描述数据和用作配置文件。
XML 文档在逻辑上主要由一下 5 个部分组成:
XML 声明:指明所用 XML 的版本、文档的编码、文档的独立性信息
文档类型声明:指出 XML 文档所用的 DTD
元素:由开始标签、元素内容和结束标签构成
注释:以结束,用于对文档中的内容起一个说明作用
处理指令:通过处理指令来通知其他应用程序来处理非 XML 格式的数据,格式为
XML 文档的根元素被称为文档元素,它和在其外部出现的处理指令、注释等作为文档实体的子节点,根元素本身和其内部的子元素也是一棵树。
样例:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student1 id="001">
<微信公众号>微信1</微信公众号>
<学号>20140101</学号>
<地址>广州</地址>
<座右铭>要么强大,要么听话</座右铭>
</student1>
<student2 id="002">
<新浪微博>微博1</新浪微博>
<学号>20140102</学号>
<地址>广州</地址>
<座右铭>在哭泣中学会坚强</座右铭>
</student2>
</students>
</students>
1.2.1 XML解析方式
Dom4j、Sax、Pull
1.2.2 Dom4j与Sax区别
dom4j不适合大文件的解析,因为它是一下子将文件加载到内存中,所以有可能出现内存溢出,sax是基于事件来对xml进行解析的,所以他可以解析大文件的xml,也正是因为如此,所以dom4j可以对xml进行灵活的增删改查和导航,而sax没有这么强的灵活性,所以sax经常是用来解析大型xml文件,而要对xml文件进行一些灵活(crud)操作就用dom4j。
1.2.3使用dom4j解析xml
解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:
1.自己创建Document对象
Document document = DocumentHelper.createDocument(); Element root = document.addElement("students"); |
其中students是根节点,可以继续添加其他节点等操作。
2.自己创建Document对象
// 创建SAXReader对象 SAXReader reader = new SAXReader(); // 读取文件 转换成Document Document document = reader.read(new File("XXXX.xml")); |
3.读取XML文本内容获取Document对象
String xmlStr = "<students>......</students>"; Document document = DocumentHelper.parseText(xmlStr); |
1.2.4 解析xml代码
添加依赖:
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.0.0</version>
</dependency>
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student1 id="001">
<微信公众号>微信1</微信公众号>
<学号>20140101</学号>
<地址>广州</地址>
<座右铭>要么强大,要么听话</座右铭>
</student1>
<student2 id="002">
<新浪微博>微博1</新浪微博>
<学号>20140102</学号>
<地址>广州</地址>
<座右铭>在哭泣中学会坚强</座右铭>
</student2>
</students>
java代码:
public class Test003 {
public static void main(String[] args) throws DocumentException {
String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<students>\n" +
"\t<student1 id=\"001\">\n" +
"\t\t<微信公众号>微信1</微信公众号>\n" +
"\t\t<学号>20140101</学号>\n" +
"\t\t<地址>广州</地址>\n" +
"\t\t<座右铭>要么强大,要么听话</座右铭>\n" +
"\t</student1>\n" +
"\t<student2 id=\"002\">\n" +
"\t\t<新浪微博>微博1</新浪微博>\n" +
"\t\t<学号>20140102</学号>\n" +
"\t\t<地址>广州</地址>\n" +
"\t\t<座右铭>在哭泣中学会坚强</座右铭>\n" +
"\t</student2>\n" +
"</students> ";
Document document = DocumentHelper.parseText(xmlStr.replace("\n",""));
Element rootElement=document.getRootElement();
getNodes(rootElement);
}
public static void getNodes(Element rootElement){
String name=rootElement.getName();
System.out.println("节点名臣:"+name);
// 获取属性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);
}
}
}