XML和JSON

XML

xml是一直数据格式,是不同计算机语言以及平台之间传输的数据格式,该格式早前用来传输数据,现在传输数据有了更好用的JSON以后,xml的作用就主要用于配置环境了,但是还是有很多人用xml来传输。

格式

<?xml version="1.0" encoding="UTF-8"?>
<Books>
       <book id = "0001">
           <name> 格林童话</name>
           <price> 120</price>
       </book>
        <book id = "0002">
           <name><![CDATA[ 安徒< >生童话 ]]></name>
           <price> 100</price>
        </book>
</Books>
  1. 首行是配置
  2. 然后是根节点,根节点下有很多子节点比如事例中有book,是Books的子节点,子节点还可以创建子节点,比如book中有两个name和price子节点。
  3. 子节点也可以设置属性,属性一定是字符串格式
  4. 以每一个节点以<>开头,</>结尾,中间加内容
  5. 如果内容中有特殊的符号比如<>或者别的会产生错误的符号,就要
    添加<![CDATA[[ ]]>,被这个符号括住的内容不会被解析为符号
  6. 节点名称有如下规则
    1.名称可以含字母、数字以及其他的字符
    2.名称不能以数字或者标点符号开始
    3.名称不能以字符 “xml”(或者 XML、Xml)开始
    4.名称不能包含空格,不能包含冒号(:)
    5.名称区分大小写
  7. 注释:注释开始: < !-- 注释结束: – >

xml解析

有四种方式
1.SAX解析:逐行解析,需要的内存小,但是解析不能反回,解析一行以后,前面的都会销毁。
2.DOM解析:是全部加载完,加载成树状,然后解析,需要的内存大,但是解析需要的内容很方便,可以直接检索
3.JDOM解析:DOM的分支,是java特定模型比DOM多了几个功能
4.DOM4J解析:DOM的完善分支,在DOM的基础上增加了很多新方法,是目前用的最多的

DOM4J

  1. 引入jar文件 dom4j.jar
  2. 创建一个指向XML文件的输入流
    FileInputStream fis = new FileInputStream(“xml文件的地址”);
  3. 创建一个XML读取工具对象
    SAXReader sr = new SAXReader();
  4. 使用读取工具对象, 读取XML文档的输入流 , 并得到文档对象
    Document doc = sr.read(fis);
  5. 通过文档对象, 获取XML文档中的根元素对象
    Element root = doc.getRootElement();

常用方法有

  1. public Element element( " 节点标记 ")返回的是方法调用者的第一个子节点
    所有的节点类型都是Element
  2. public String getText() 返回的是该节点的内容
  3. public void setText)作用是设置节点内容
  4. public List elements() 返回包含所有子节点的一个集合
  5. public String elementText( “子节点名称” ) 返回子节点的内容
  6. public String attributeValue(String 属性名称) 返回属性内容
  7. public String getName() 返回节点名称
  8. public Element addElement( " 子节点名称 " ) 增加一个子节点
    9 public void addAttribute(String 属性名,String 属性值) 添加属性

示例

public class Dome4 {
    public static void main(String[] args) throws FileNotFoundException, DocumentException {
        FileInputStream file = new FileInputStream("E://Book.xml");
        SAXReader sax = new SAXReader();
        Document doc = sax.read(file);
        Element root = doc.getRootElement();
        Element book = root.element("book");
        System.out.println(book.elementText("name"));

    }
}

DOM4J - XPATH解析XML

首先生成一个需要解析的doc文档,然后通过两个方法来查找相应的节点
方法1.
//根据路径表达式, 查找匹配的节点
Element e = selectSingleNode(“路径表达式”);
方法2.
List es = selectNodes(“路径表达式”);
路径表达式格式

  1. / : 从根节点开始查找
  2. // : 从发起查找的节点位置 查找后代节点 ***
  3. . : 查找当前节点
  4. … : 查找父节点
  5. @ : 选择属性. *
    属性使用方式:
    [@属性名=‘值’]
    [@属性名>‘值’]
    [@属性名<‘值’]
    [@属性名!=‘值’]

常用的是//和[@属性名=‘值’]

示例

public class Demo5 {
    public static void main(String[] args) throws FileNotFoundException, DocumentException {
        FileInputStream file = new FileInputStream("E://Book.xml");
        SAXReader reader = new SAXReader();
        Document doc = reader.read(file);
        //如果查找单个节点,该节点又有很多同名节点,节点有属性的,就添加属性查找,没属性的话,只能查找第一个节点
        Element book = (Element) doc.selectSingleNode("//book[@id='1']//book");
        System.out.println(book.element("name").getText());
        Element price = (Element) doc.selectSingleNode("//price");
        System.out.println(price.getText());


    }
}

如果要查找第二本或者第三本书的属性,就要用先获得第二本书,然后用element方法找到需要的属性,selectSingleNode和element方法一样,只能获得第一个节点。

用java生成xml格式数据

  1. 通过文档帮助器 (DocumentHelper) , 创建空的文档对象
    Document doc = DocumentHelper.createDocument();
  2. 通过文档对象, 向其中添加根节点
    Element root = doc.addElement(“根节点名称”);
  3. 通过根节点对象root , 丰富我们的子节点
    Element e = root.addElement(“元素名称”);
  4. 创建一个文件输出流 ,用于存储XML文件
    FileOutputStream fos = new FileOutputStream(“要存储的位置”);
  5. 将文件输出流, 转换为XML文档输出流
    XMLWriter xw = new XMLWriter(fos);
  6. 写出文档
    xw.write(doc);
  7. 释放资源
    xw.close();

XStream生成xml

通过XStream快速将对象生成xml

  1. 创建XStream 对象
    XStream x = new XStream();
  2. 修改类生成的节点名称 (默认节点名称为 包名.类名)
    x.alias(“节点名称”,类名.class);
  3. 传入对象 , 生成XML字符串
    String xml字符串 = x.toXML(对象);

示例

public class Demo6 {
    public static void main(String[] args) {
        Book book = new Book("安徒生童话","丹麦作家写的童话故事","100元");
        XStream x = new XStream();
        x.alias("book",Book.class);
        String xml = x.toXML(book);
        System.out.println(xml);
    }
}
<book>
  <name>安徒生童话</name>
  <info>丹麦作家写的童话故事</info>
  <price>100</price>
</book>

Process finished with exit code 0

JSON

java数据传输格式的重中之重。
JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式,格式简单传输和解析的效率比xml高很多。
格式

{
"name" : "安徒生童话" ,
"info" : "丹麦作家写的童话故事"
}

1.属性之间用,隔开
2.并且可以互相嵌套
3.[元素1,元素2…]

{
"name" : "安徒生童话" ,
"info" : "丹麦作家写的童话故事",
"story ":[ "皇帝的新装","卖火柴的小女孩"{
"info" : 讲述了一个小女孩在冬天买火柴的故事
 } ]"price" : "100元"
}

GSON

GSON是转换json格式的一个工具包
转换JSON字符串的步骤:

  1. 引入JAR包
  2. 在需要转换JSON字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);
import com.google.gson.Gson;

public class Gjson {
    public static void main(String[] args) {
        Book book = new Book("安徒生童话","丹麦作家写的童话故事","123");
        Gson g = new Gson();
        String s = g.toJson(book);
        System.out.println(s);
       
}
{"name":"安徒生童话","info":"丹麦作家写的童话故事","price":"123元"}

Process finished with exit code 0

将JSON对象转换为字符串

  1. 引入JAR包
  2. 在需要转换Java对象的位置, 编写如下代码:
    对象 = new Gson().fromJson(JSON字符串,对象类型.class);
public class Gjson {
    public static void main(String[] args) {
        Gson g = new Gson();
        //{"name":"安徒生童话","info":"丹麦作家写的童话故事","price":"123","list":["12","13","14"]}
        Object book2= g.fromJson("{\"name\":\"安徒生童话\",\"info\":\"丹麦作家写的童话故事\",\"price\":\"123\",\"list\":[\"12\",\"13\",\"14\"]}",Object.class);
        System.out.println(book2.toString());

    }

如果没有指定特性的类的话(用Object),解析出来的是class com.google.gson.internal.LinkedTreeMap的对象
如果JSON格式的数据比转换的对象的属性多,那么多的部分会丢失
以下FastJson同理,多出来的部分属性会丢失

public class Gjson {
    public static void main(String[] args) {
        Gson g = new Gson();
 //{"name":"安徒生童话","info":"丹麦作家写的童话故事","price":"123","list":["12","13","14"]}
        Book book2= g.fromJson("{\"name\":\"安徒生童话\",\"info\":\"丹麦作家写的童话故事\",\"price\":\"123\",\"list\":[\"12\",\"13\",\"14\"]}",Book.class);
        System.out.println(book2.toString());


    }
}
Book{name='安徒生童话', info='丹麦作家写的童话故事', price='123'}

Process finished with exit code 0

FastJson

使用方式是导包,然后用JSON的三个方法进行互相转换,不需要创建FastJson对象。

public class Fast {
    public static void main(String[] args) {
        Book book = new Book("安徒生童话","丹麦作家写的童话故事","123元");
        String s = JSON.toJSONString(book);

        Book book1 = JSON.parseObject(s,Book.class);
        List list = JSON.parseArray(s,List.class);
    }
}

JSON.parseObject( 字符串类型的参数,类型.class),把json字符串转为相应的对象
JSON.parseArray(s,List.class),把json字符串转为相应的List集合
JSON.toJSONString(book),是把对象转为json字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值