前言:
目前java通信过程中常见的数据格式有xml格式和json格式
两者对比:
json轻便、解析简单,对客户端更加友好。JSON相对于XML来讲,数据的体积小,传递的速度更快些。
XML更加笨重,解析为DOM树并遍历节点来取数据,优点是结构清晰,扩展性好。
XML的缺点
A.XML文件庞大,文件格式复杂,传输占带宽;
B.服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;
C.客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;
D.服务器端和客户端解析XML花费较多的资源和时间。
JSON对数据的描述性比XML较差。
XML:用到jar包是:xstream.jar dom4j.jar
扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
1: 读取本地xml文件 相对路径
private static void getLocationXml() throws IOException, DocumentException { //1. 获取输入流 FileInputStream fis = new FileInputStream("../1214 饶德智 第四章第8节/src/Demo1.xml"); //2.创建XML读取对象 SAXReader sr = new SAXReader(); //3.读取并得到文档对象 Document doc = sr.read(fis); //4.通过文档获取根元素 Element root = doc.getRootElement(); //5.开始解析元素 System.out.println(root.getName()); //打印 //Element book = root.element("book"); //Element name = book.element("name"); //System.out.println(name.getText()); List<Element> es = root.elements(); for(int i=0;i<es.size();i++){ Element book = es.get(i); System.out.println(book.attributeValue("id")); System.out.println(book.elementText("name")); System.out.println(book.elementText("info")); System.out.println("-----------------------------"); } //获取某个节点 Node n = doc.selectSingleNode("//book[@id='1002']//name"); System.out.println("获取指定id=1002的节点"+n.getName()+":"+n.getText()); fis.close(); }
2:读取网络xml文件
private static void getNetDataXml() throws IOException, DocumentException { String phone = "18313935565"; //1. 获取到XML资源的输入流 URL url = new URL("http://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253"); URLConnection conn = url.openConnection(); InputStream is = conn.getInputStream(); //2. 创建一个XML读取对象 SAXReader sr = new SAXReader(); //3. 通过读取对象 读取XML数据,并返回文档对象 Document doc = sr.read(is); //4. 获取根节点 Element root = doc.getRootElement(); //5. 解析内容 String code = root.elementText("resultcode"); if("200".equals(code)){ Element result = root.element("result"); String province = result.elementText("province"); String city = result.elementText("city"); if(province.equals(city)){ System.out.println("手机号码归属地为:"+city); }else{ System.out.println("手机号码归属地为:"+province+" "+city); } }else{ System.out.println("请输入正确的手机号码"); } Node node = doc.selectSingleNode("//company"); System.out.println("指定某个节点运营商:"+node.getText()); }
3:在XML写内容,并保存到文件
private static void saveXml() throws IOException, DocumentException{ //1. 通过文档帮助器,创建一个文档对象 Document doc = DocumentHelper.createDocument(); //2. 给文档添加第一个节点(根节点) Element books = doc.addElement("books"); //3. 通过根节点, 丰富子节点 for(int i=0;i<100;i++){ Element book = books.addElement("book"); Element name = book.addElement("name"); name.setText(i+"种苹果的小姑娘~"); Element info = book.addElement("info"); info.setText(i+"辛勤种植苹果的故事~"); book.addAttribute("id",100+i+""); } //4. 创建一个文件输出流 FileOutputStream fos = new FileOutputStream("../1214 饶德智 第四章第8节/src/books.xml"); //5. 将输出流转换为XML输出流 XMLWriter xw = new XMLWriter(fos); //6. 写出文档 xw.write(doc); //7. 释放资源 xw.close(); System.out.println("执行完毕"); }
4: 实体类转xml
private static void objectToXml(){ Person p = new Person(); p.setName("张三"); p.setAge(18); //XStream使用 //1、创建XStream对象 XStream x = new XStream(); //2、修改某个类型生成的节点 (可选的,默认为包名.类名) x.alias("person",Person.class); //3、传入对象,开始生成 String xml = x.toXML(p); System.out.println(xml); }
代码目录结构:
JSON :
JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)体系的行为。这些特性使JSON成为理想的数据交换语言。
JSON基于JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。
1:Gson 用到的jar包是:gson-2.8.6.jar
//对象转JSON字符串 Book b = new Book("100","金苹果","种植苹果真辛苦"); String s = new Gson().toJson(b); System.out.println(s); //JSON字符串转对象 Gson g = new Gson(); //2. 转换 : {"id":"100","name":"金苹果","info":"种植苹果真辛苦"} Book book = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果真辛苦\"}", Book.class); System.out.println(book.getId()); //复杂JSON字符串转对象 Gson gson = new Gson(); HashMap data = gson.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果真辛苦\",\"page\":[\"锄禾日当午\",\"汗滴禾下土\",\"嘿嘿嘿嘿嘿\"]}", HashMap.class); List page = (List) data.get("page"); System.out.println(page.get(1));
2:fastjson 用到的jar包是:fastjson-1.2.70.jar
Book book1 = new Book("1002","唐诗三百首","床前明月光,地上鞋一堆。床上我杰哥,喊十块钱一双。"); //对象转JSON字符串 String json = JSON.toJSONString(book1); System.out.println(json); //JSON字符串转对象 Book book2 = JSON.parseObject("{\"id\":\"1002\",\"info\":\"床前明月光,地上鞋一堆。床上我杰哥,喊十块钱一双。\",\"name\":\"唐诗三百首\"}", Book.class); System.out.println(book2.getId()); //解析字符串数组 List<String> strings = JSON.parseArray("[\"一二三\",\"二三四\",\"三四五\"]", String.class); System.out.println(strings.get(1));
: