闭关修炼(七)数据交换格式


文章目录

  • 数据交换格式
    • 什么是数据交换格式
    • 什么是json?
    • 什么是xml?
    • json和xml区别/使用场景?
  • Json
    • json类型
    • java操作json有哪些框架?
  • fastjson
    • 引入依赖包
    • json字符串转jsonObject例子
    • json字符串转成对象例子
    • 自定义构造json字符串
    • 对象转json字符串
  • XML
    • 什么是xml?
    • 解析xml的方式有哪些?
      • dom4j和sax的区别
    • 解析xml例子


数据交换格式

什么是数据交换格式

通讯的报文,实体之间通讯需要传递某种格式的报文(参数),常用的数据交换格式有json和xml,html也属于数据交换格式,不过常用来展示页面。

某种程度上,可以理解为数据交换格式=报文=参数列表

什么是json?

很简单的问题。(尽量专业说明)

是一种轻量级的数据交换格式。实际项目中运用比较多,http+restful。

面向服务架构(sos)或者微服务架构的接口大多数都是采用http+json格式

什么是xml?

是一种重量级的数据交换格式,简称为标记语言

json和xml区别/使用场景?

json占用宽带小,xml占用宽带大。
配置文件通常使用xml
webservice使用soap协议通过http+xml传输报文
银行项目内部接口使用xml(太过过时)
maven配置

Json

json类型

jsonobject json对象 {}
jsonarray json数组 []
json例子

{
     
	"key": "value",
	"item":[{
     
		"obj1":"1",
		"obj2":"2"}]
}

java操作json有哪些框架?

gson(谷歌),fastjson(阿里巴巴),jackson(springmvc)

fastjson

引入依赖包

1.2.几的fastjson好像用法改了,用回1.1吧

<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>fastjsonartifactId>
    <version>1.1.43version>
dependency>

json字符串转jsonObject例子

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);
        }
    }
}

json字符串转成对象例子

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字符串

自己构造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());
    }
}

在这里插入图片描述

对象转json字符串

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有根节点,根节点下有二级节点,再下面有三级、四级…等等,类似树状的存储结构。

xml声明:指明xml的版本,编码,文档独立性信息,文档类型声明,所用的DTD文件(xml的约束,提示报错,远程拉取,本地缓存DTD文件)

<?xml version="1.0" encoding="UTF-8"?>

解析xml的方式有哪些?

dom4j, sax, pull

dom4j和sax的区别

dom4j不适合大文件的解析,因为它是一下子将文件全加载到内存中,可能会造成内存溢出,sax是基于事件来对xml进行解析的,可以解析大文件。

解析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);
        }


    }
}


你可能感兴趣的:(java闭关修炼)