热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JAVA与XML语言与JSON语言

XML与JSON在java的使用



XML与JSON在java的使用

文章目录


  • XML与JSON在java的使用
  • 前言
  • 一、XML和JSON优缺点
    • 1.定义介绍
    • 2.优缺点
      • (1).XML的优缺点
      • (2).JSON的优缺点

    • 3.XML和JSON的优缺点对比

  • 二、语法格式
    • 1、写XML文档
      • 1、解析XML
        • 2、解析网络XML文件案例
        • 3、通过路径快速的查找一个或一组元素
        • 4、XStream 的使用,快速的将Java中的对象, 转换为 XML字符串.
        • 5、Java生成XML文档


    • 2、写JSON文档
    • Java与JSON做什么?
        • 1、Gson
        • 2、FastJson






前言

提示:下面案例都引入XML与JSON的工具类才能实现以下方法

一、XML和JSON优缺点

1.定义介绍

(1).XML定义
扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。

(2).JSON定义
JSON(Javascript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。

2.优缺点


(1).XML的优缺点

<1>.XML的优点
  1、.格式统一,符合标准;

2、容易与其他系统进行远程交互,数据共享比较方便。

<2>.XML的缺点
  1、XML文件庞大,文件格式复杂,传输占带宽;

2、服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;

3、客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;

4、、服务器端和客户端解析XML花费较多的资源和时间。

(2).JSON的优缺点

1.JSON的优点:
  1、.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;

2、.易于解析,客户端Javascript可以简单的通过eval()进行JSON数据的读取;

3、.支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, Javascript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;

4、在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;

5、.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。

2.JSON的缺点
  1、没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;

2、.JSON格式目前在Web Service中推广还属于初级阶段。

3.XML和JSON的优缺点对比

(1).可读性方面
JSON和XML的数据可读性基本相同,JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,XML可读性较好些。

(2).可扩展性方面。
XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

(3).编码难度方面。
XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。

(4).解码难度方面。
XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。

(5).流行度方面。
XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。

(6).解析手段方面
JSON和XML同样拥有丰富的解析手段。

(7).数据体积方面。
JSON相对于XML来讲,数据的体积小,传递的速度更快些。

(8).数据交互方面。
JSON与Javascript的交互更加方便,更容易解析处理,更好的数据交互。

(9).数据描述方面。
JSON对数据的描述性比XML较差。

(10).传输速度方面。
JSON的速度要远远快于XML。

二、语法格式

1、写XML文档


  1. XML文档声明



  1. 标记 ( 元素 / 标签 / 节点)XML文档,由一个个的标记组成.
    语法:
    开始标记(开放标记): <标记名称>
    结束标记(闭合标记):

    标记名称: 自定义名称,必须遵循以下命名规则
    1.名称可以含字母、数字以及其他的字符
    2.名称不能以数字或者标点符号开始
    3.名称不能以字符 “xml”(或者 XML、Xml)开始
    4.名称不能包含空格,不能包含冒号(:)
    5.名称区分大小写
    标记内容: 开始标记与结束标记之间 ,是标记的内容.
    例如 ,我们通过标记, 描述一个人名:
    李伟杰
  2. 一个XML文档中, 必须有且且仅允许有一个根标记.

正例:


张三
李四

反例:

李四
麻子

  1. 标记可以嵌套, 但是不允许交叉.

正例:

李四
18

反例:

李四
18


  1. 标记的层级称呼 (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记)
    例如:



李四
180cm


李四
200cm


name是person的子标记.也是person的后代标记
name是persons的后代标记.
案例:
语法进阶CDATA (了解)
name是length的兄弟标记.
person是name的父标记.
persons是name的祖先标记.
6. 标记名称 允许重复
7. 标记除了开始和结束 , 还有属性.
标记中的属性, 在标记开始时 描述, 由属性名和属性值 组成.
格式:
在开始标记中, 描述属性.
可以包含0-n个属性, 每一个属性是一个键值对!
属性名不允许重复 , 键与值之间使用等号连接, 多个属性之间使用空格分割.
属性值 必须被引号引住.
案例:




李四
18


李四
20



  1. 注释
    注释不能写在文档文档声明前
    注释不能嵌套注释
    格式:

注释开始:

1、解析XML

代码如下(示例):

public static void main(String[] args) throws IOException, DocumentException {
// 文件获取输入流
FileInputStream fis = new FileInputStream("Demo1.xml");
// 创建XML读取对象
SAXReader sax = new SAXReader();
// 读取并得到文档对象
Document read = sax.read(fis);
// 通过文档获取根元素
Element root = read.getRootElement();
// 开始解析元素
System.out.println(root.getName()); //通过根元素获取子元素book
Element book = root.element("book"); //通过book元素获取子元素name
Element name = book.element("name"); //打印元素name中的内容
System.out.println(name.getText());
System.out.println("-----------------------------");
//把元素放入集合中 通过根元素获取子元素
List es = root.elements();
for (int i=0;i<2;i++){
Element book1 = es.get(i); //打印book属性中的‘id’内容
System.out.println(book1.attributeValue("id")); //打印获取book中子元素name的内容
System.out.println(book1.elementText("name"));
System.out.println(book1.elementText("info"));
System.out.println("----------------");
}
// 结束输入流
fis.close();
}

2、解析网络XML文件案例

public static void main(String[] args) throws IOException, DocumentException {
String phOne= "17681688646";
//1
//获取到XML资源的输入流
URL utl = new URL("http://apis.juhe.cn/mobile/get?phOne="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253"); //打开链接
URLConnection cOnn= utl.openConnection();
//拿到网址下的输入流
InputStream is = conn.getInputStream();
//2
//创建一个XML读取对象
SAXReader rs = new SAXReader();
//3通过读取对象 读取XML数据 并返回文档对象
Document read = rs.read(is);
//获取根节点
Element root = read.getRootElement();
//5、解析内容
// 获取根节点中resultcode元素的内容 转成Stringt类型的对象
String kod = root.elementText("resultcode");
//如果kod中的内容根200一样则进入if
if ("200".equals(kod)){ // 根据resultcode元素获取result元素中的内容 转成Element类型的对象
Element res = root.element("result"); // 根据resultcode元素获取province元素中的内容 转成String类型的对象
String sheng = res.elementText("province"); // 根据resultcode元素获取citye元素中的内容 转成String类型的对象
String feng = res.elementText("city"); // 如果省份跟市区一样则进入if
if (sheng.equals(feng)){System.out.println("手机号归属地:"+feng);
}else {System.out.println("手机号归属地:"+sheng+" "+feng);
} // 根据resultcode元素获取company元素中的内容 转成String类型的对象
String yu = res.elementText("company");
System.out.println(yu);
}else {//如果手机号查不到则打印手机号不正确
System.out.println("请输入正确的手机号!");
}
}

3、通过路径快速的查找一个或一组元素

public static void main(String[] args) throws DocumentException, IOException {
// 文件获取输入流
FileInputStream fis = new FileInputStream("Demo1.xml");
// 创建XML读取对象
SAXReader sax = new SAXReader();
// 读取并得到文档对象
Document read = sax.read(fis);
// 通过文档对象+xpath,查找所有的name节点
List names = read.selectNodes("//name");
for (int i = 0;i System.out.println(names.get(i).getName());
System.out.println(names.get(i).getText());
}
//如果name节点是‘多个‘用selectNode方法来查 通过文档对象+xpath,查找book属性和id=‘1001’属性中所有的name节点
List name = read.selectNodes("//book[@id='1001']//name");
for (int i = 0;i System.out.println(name.get(i).getName());
System.out.println(name.get(i).getText());
}
//如果name节点是‘一个’用selectSingleNode方法来查 通过文档对象+xpath,查找book属性和id=‘1001’属性中所有的name节点
Node n = read.selectSingleNode("//book[@id='1001']//name");
System.out.println(n.getName()+":"+n.getText());
fis.close();
}

4、XStream 的使用,快速的将Java中的对象, 转换为 XML字符串.

public static void main(String[] args) throws IOException {
Person p = new Person();
p.setName("章梓枫");
p.setAge(19);
//XStream使用
//1、创建XStresm对象
XStream x = new XStream();
//2、修改生成的根节点(可选的, 默认为包名。类名)
//把person生成最外面的节点名
x.alias("person",Person.class);
//3、传入对像开始生成
String xml = x.toXML(p);
System.out.println(xml);
//4、创建文件的输出流
FileOutputStream fos = new FileOutputStream("Dome3.xml");
//5、将输出流转换为XML输出流
XMLWriter xw = new XMLWriter(fos);
//6、写出文档
xw.write(xml);
//释放资源
xw.close();
System.out.println("执行完成!");
}
static class Person{
private String name;
private int age;
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

5、Java生成XML文档

public static void main(String[] args) throws IOException {
//1、通过文档帮助器,创建一个文档对象
Document dos = DocumentHelper.createDocument();
//2、 给文档添加第一个节点(根节点)
Element book = dos.addElement("books");
//3、通过根节点,丰富子节点
for (int i =0;i<12;i++){
//添加子元素
Element book1 = book.addElement("book");
Element name = book1.addElement("name");
//向name元素中添加内容
name.setText("java");
Element info = book1.addElement("neirong");
//向neirong元素中添加内容
info.setText("讲述了一门编程语言");
//添加属性
book.addAttribute("id",156+i+"");
}
//4、创建文件的输出流
FileOutputStream fos = new FileOutputStream("Dome2.xml");
//5、将输出流转换为XML输出流
XMLWriter xw = new XMLWriter(fos);
//6、写出文档
xw.write(dos);
//释放资源
xw.close();
System.out.println("执行完成!");


}

2、写JSON文档

JSON:
{
“name”:“金苹果”,
“info”:“种苹果”
}
1、一个对象, 由一个大括号表示.
2、括号中 描述对象的属性 . 通过键值对来描述对象的属性
(可以理解为, 大括号中, 包含的是一个个的键值对.)格式:
3、键与值之间使用冒号连接, 多个键值对之间使用逗号分隔.
4、键值对的键 应使用引号引住 (通常Java解析时, 键不使用引号会报错. 而JS能正确解析.)

5、键值对的值, 可以是JS中的任意类型的数据
6、在JSON格式中可以与对象互相嵌套
[元素1,元素2…]
代码如下(示例):

{
"name":"伟杰老师",
"age":18,
"pengyou":["张三","李四","王二","麻子",{
"name":"野马老师",
"info":"像匹野马一样狂奔在技术钻研的道路上"
}],
"heihei":{
"name":"大长刀",
"length":"40m"
}
}

Java与JSON做什么?

1、将Java中的对象 快速的转换为 JSON格式的字符串.
2、将JSON格式的字符串, 转换为Java的对象.
创建一个Book类给下面的方法使用:

public class Book {
private String id;
private String name;
private String info;
@Override
public String toString() {
return "Book{" +"id='" + id + '\'' +", name='" + name + '\'' +", info='" + info + '\'' +'}';
}
public Book(String id, String name, String info) {
this.id = id;
this.name = name;
this.info = info;
}
public Book() {
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Objects.equals(id, book.id) && Objects.equals(name, book.name) && Objects.equals(info, book.info);
}
@Override
public int hashCode() {
return Objects.hash(id, name, info);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}

1、Gson

1、将对象转换为JSON字符串
转换JSON字符串的步骤:

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

//1、创建Gson对象
Gson g= new Gson();
//2、转换
Book b= new Book("1001","科技","关于科技的图书");//把Book中内容转换成JSON类型d
String s = g.toJson(b);
System.out.println(s);
System.out.println("---------------------------------------------");
//如果只用一次Gson可以这样写
String s1 = new Gson().toJson(b);
System.out.println(s1);

2、将JSON字符串转换为对象
代码如下(示例):

//1、创建Gson对象
Gson g= new Gson();
//2、把JSON类型的{"id":"1001","name":"科技","info":"关于科技的图书"} 转换成 java类型的book类 //把JSON类型转换成别的类型的fromJson方法 //要转的类型
Book b = g.fromJson("{\"id\":\"1001\",\"name\":\"科技\",\"info\":\"关于科技的图书\"}", Book.class);
System.out.println(b.getId());

2、FastJson

1、将对象转换为JSON字符串
代码如下(示例):

Book b= new Book("1001","科技","关于科技的图书");
//转换成 JSON类型的
String j = JSON.toJSONString(b);
System.out.println(j);

2、将JSON字符串转换为对象
代码如下(示例):

//2、把JSON类型的{"id":"1001","name":"科技","info":"关于科技的图书"} 转换成 java的Book类
Book book = JSON.parseObject("{\"id\":\"1001\",\"name\":\"科技\",\"info\":\"关于科技的图书\"}", Book.class);
System.out.println(book.getId());




推荐阅读
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 导读:在编程的世界里,语言纷繁多样,而大部分真正广泛流行的语言并不是那些学术界的产物,而是在通过自由发挥设计出来的。和那些 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 有关phpfgetss()函数的文章推荐10篇
    有关phpfgetss()函数的文章推荐10篇:了解如何使用PHP的各种文件函数。查看诸如fopen、fclose和feof之类的基本文件函数;了解诸如fgets、fgetss和f ... [详细]
author-avatar
平凡洗护店
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有