通讯的报文,实体之间通讯需要传递某种格式的报文(参数),常用的数据交换格式有json和xml,html也属于数据交换格式,不过常用来展示页面。
某种程度上,可以理解为数据交换格式=报文=参数列表
很简单的问题。(尽量专业说明)
是一种轻量级的数据交换格式。实际项目中运用比较多,http+restful。
面向服务架构(sos)或者微服务架构的接口大多数都是采用http+json格式
是一种重量级的数据交换格式,简称为标记语言
json占用宽带小,xml占用宽带大。
配置文件通常使用xml
webservice使用soap协议通过http+xml传输报文
银行项目内部接口使用xml(太过过时)
maven配置
jsonobject json对象 {}
jsonarray json数组 []
json例子
{
"key": "value",
"item":[{
"obj1":"1",
"obj2":"2"}]
}
gson(谷歌),fastjson(阿里巴巴),jackson(springmvc)
1.2.几的fastjson好像用法改了,用回1.1吧
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.1.43version>
dependency>
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class Test1 {
public static void main(String[] args) {
String jsonStr = "{ \"key\": \"value\", \"item\":[{ \"obj1\":\"1\", \"obj2\":\"2\"}] }";
System.out.println(jsonStr);
// 字符串转json对象
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
// 获取值
String value = jsonObject.getString("key");
System.out.println(value);
// 获取json数组
JSONArray item = jsonObject.getJSONArray("item");
System.out.println(item);
// json数组存放对象,遍历
for (int i = 0; i < item.size(); i++) {
JSONObject object = item.getJSONObject(i);
String s = object.getString("obj1");
System.out.println(s);
s = object.getString("obj2");
System.out.println(s);
}
}
}
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import lombok.val;
@Data
@AllArgsConstructor
@NoArgsConstructor
class Item {
private String itemId;
private String itemName;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class User {
private String username;
private String password;
private List<Item> items;
}
public class Test2 {
public static void main(String[] args) {
String jsonStr = "{\"username\":\"likeghee\",\"password\":\"123456\",\"items\":[{\"itemId\":\"999\",\"itemName\":\"扫把\"}]}";
// json字符串直接转User对象
val user = JSONObject.parseObject(jsonStr, User.class);
System.out.println(user);
}
}
自己构造json字符串
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class Test3 {
public static void main(String[] args) {
JSONObject root = new JSONObject();
root.put("id", "20");
root.put("name", "jack");
JSONArray jsonArray = new JSONArray();
JSONObject obj1 = new JSONObject();
obj1.put("itemId", "9999");
obj1.put("itemName", "lorem");
jsonArray.add(obj1);
root.put("items", jsonArray);
System.out.println(root.toJSONString());
}
}
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class Test3 {
public static void main(String[] args) {
User user = new User();
user.setUsername("yyz");
user.setPassword("1234");
List<Item> items = new ArrayList<>();
Item item = new Item();
item.setItemId("999");
item.setItemName("jack");
items.add(item);
user.setItems(items);
System.out.println(user);
// 对象转json字符串
String jsonStr = JSONObject.toJSONString(user);
System.out.println(jsonStr);
}
}
标记语言,一般用来做描述数据和做配置文件。
xml有根节点,根节点下有二级节点,再下面有三级、四级…等等,类似树状的存储结构。
xml声明:指明xml的版本,编码,文档独立性信息,文档类型声明,所用的DTD文件(xml的约束,提示报错,远程拉取,本地缓存DTD文件)
<?xml version="1.0" encoding="UTF-8"?>
dom4j, sax, pull
dom4j不适合大文件的解析,因为它是一下子将文件全加载到内存中,可能会造成内存溢出,sax是基于事件来对xml进行解析的,可以解析大文件。
创建一个用于演示的报文
<student>
<student1 id="001">
<name>yyzname>
<password>1234password>
student1>
<student2 id="002">
<name>jackname>
<password>9999password>
student2>
student>
引入dom4j包
<dependency>
<groupId>org.dom4jgroupId>
<artifactId>dom4jartifactId>
<version>2.0.0version>
dependency>
读取xml,用的不多,混个眼熟吧
import lombok.SneakyThrows;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.Iterator;
import java.util.List;
public class Test4 {
@SneakyThrows
public static void main(String[] args) {
// 获取读取对象
SAXReader saxReader = new SAXReader();
// 读取xml
Document doc = saxReader.read("Student.xml");
// 获取根节点
Element rootElement = doc.getRootElement();
getNodes(rootElement);
}
static public void getNodes(Element e){
// 获取节点名称
String name = e.getName();
System.out.println("节点名称:"+ name);
// 获取节点属性
List<Attribute> attributes = e.attributes();
for (Attribute a : attributes){
System.out.println("节点属性名称:" + a.getName());
System.out.println("节点属性value:" + a.getValue());
}
// 获取节点value
String value = e.getText().trim();
if (!value.equals("")){
System.out.println("节点value:" + value);
}
// 迭代器,判断是否有下一个节点
Iterator<Element> elementIterator = e.elementIterator();
while(elementIterator.hasNext()){
Element next = elementIterator.next();
// 打印这个节点
getNodes(next);
}
}
}