019.数据交换格式:Json、XML

简介

数据交换格式中,最核心的就是Json和XML。 其中,Json是一种轻量级数据交换格式,XML是一种重量级的数据交换格式。 相比于xml这种数据交换格式来说, 因为解析xml比较的复杂,而且需要编写大段的代码, 所以客户端和服务器的数据交换格式往往通过JSON来进行交换。

常用的json框架为: fastjson(阿里)、gson(谷歌)、jackson(SpringMVC自带) 其中,服务器端开发常用fastjson,安卓开发常用gson。

常用的XML解析方式: Dom4j、Sax、Pull 其中,dom4j不适合大文件的解析,因为它是一下子将文件加载到内存中,所以有可能出现内存溢出,sax是基于事件来对xml进行解析的,所以他可以解析大文件的xml,也正是因为如此,所以dom4j可以对xml进行灵活的增删改查和导航,而sax没有这么强的灵活性,所以sax经常是用来解析大型xml文件,而要对xml文件进行一些灵活(crud)操作就用dom4j。


fastjson

maven

		<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
		<dependency>
		    <groupId>com.alibaba</groupId>
		    <artifactId>fastjson</artifactId>
		    <version>1.2.52</version>
		</dependency>
		
		<!-- lombok是为了使用@Data注解,省去set/get方法 -->
		<dependency>
		    <groupId>org.projectlombok</groupId>
		    <artifactId>lombok</artifactId>
		    <version>1.16.18</version>
		</dependency>

code

package cn.qbz.thread;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;

import java.util.List;

public class Test112001 {

    public static void main(String[] args) {
        String str = "{\"name\":\"BeJson\",\"url\":\"http://www.bejson.com\",\"page\":88,\"isNonProfit\":true,\"address\":{\"street\":\"科技园路.\",\"city\":\"江苏苏州\",\"country\":\"中国\"},\"links\":[{\"name\":\"Google\",\"url\":\"http://www.google.com\"},{\"name\":\"Baidu\",\"url\":\"http://www.baidu.com\"},{\"name\":\"SoSo\",\"url\":\"http://www.SoSo.com\"}]}";
        JSONObject jsonStr = JSONObject.parseObject(str);
        System.out.println("name:" + jsonStr.getString("name"));
        System.out.println("page:" + jsonStr.getIntValue("page"));
        System.out.println();

        JSONArray links = jsonStr.getJSONArray("links");
        JSONObject link = links.getJSONObject(0);
        System.out.println("name:" + link.getString("name") + "\t" + "url:" + link.getString("url"));
        System.out.println();

        Test test = JSONObject.parseObject(str, Test.class);
        System.out.println("test.address.city:" + test.getAddress().getCity());
        System.out.println("test.name:" + test.getName());
        System.out.println();

        List<LinksTest> linksTests = JSONObject.parseArray(links.toJSONString(), LinksTest.class);
        System.out.println("links.size:" + linksTests.size());
        System.out.println("links[0].url:" + linksTests.get(0).getUrl());
        System.out.println();

        String testStr = JSONObject.toJSONString(test);
        System.out.println(testStr);
        System.out.println();

        JSONObject addressJson = (JSONObject) JSONObject.toJSON(test.getAddress());
        System.out.println("addressJson.city:" + addressJson.getString("city"));
        System.out.println();

        JSONArray linksArray = (JSONArray) JSONObject.toJSON(test.getLinks());
        System.out.println("links[0].name:" + linksArray.getJSONObject(0).getString("name"));
        System.out.println();

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name","name");
        JSONObject address = new JSONObject();
        address.put("city","city");
        jsonObject.put("address",address);
        JSONArray linksA = new JSONArray();
        JSONObject linkJ = new JSONObject();
        linkJ.put("name","name2");
        linksA.add(linkJ);
        jsonObject.put("links",linksA);

        System.out.println(jsonObject.toJSONString());
    }

    @Data
    static class Test {
        private String name;
        private String url;
        private Integer page;
        private Boolean isNonProfit;
        private AddressTest address;
        private List<LinksTest> links;

    }

    @Data
    static class AddressTest {
        private String street;
        private String city;
        private String country;
    }

    @Data
    static class LinksTest {
        private String name;
        private String url;
    }
}

dom4j

maven

        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

测试数据

<?xml version="1.0" encoding="UTF-8" ?>
<test id="test">
    <name>name1</name>
    <url>http://www.baidu.com</url>
    <address id="address">
        <city>address_city</city>
    </address>
    <links name="links">
        <link id="link0">
            <name>link0_name</name>
            <url>link0_url</url>
        </link>
    </links>
</test>

code

package cn.qbz.thread;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.Iterator;
import java.util.List;

public class Test112002 {
    public static void main(String[] args) throws DocumentException {
        SAXReader saxReader = new SAXReader();
        Document read = saxReader.read(new File("E:\\workspace\\jiuerxueyuan\\test\\src\\main\\java\\cn\\qbz\\thread\\test.xml"));
        //获取根节点
        Element rootElement = read.getRootElement();
        getNodes(rootElement);
    }

    private static void getNodes(Element rootElement) {
        System.out.println("当前节点名称:" + rootElement.getName());
        //获取属性
        List<Attribute> attributes = rootElement.attributes();
        for (Attribute attribute : attributes) {
            System.out.println("属性:" + attribute.getName() + "---" + attribute.getText());
        }
        //获取当前节点的内容
        if (!"".equals(rootElement.getTextTrim())) {
            System.out.println(rootElement.getName() + "---" + rootElement.getText());
        }

        //递归获取其子节点下的内容
        Iterator<Element> elementIterable = rootElement.elementIterator();
        while (elementIterable.hasNext()) {
            Element next = elementIterable.next();
            getNodes(next);
        }
    }
}

XML与JSON区别

Xml是重量级数据交换格式,占宽带比较大。 JSON是轻量级交换格式,xml占宽带小。 所有很多互联网公司都会使用json作为数据交换格式 很多银行项目,有些还是在使用xml。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DOTNET

C#要点补充

1字符串与时间的互转 DateTime.TryParse将空字符串、为null或格式不正确,则转换为的DateTime所代表的值为:0001/1/1 0:00...

29550
来自专栏Jed的技术阶梯

Kafka 自定义序列化器和反序列化器

现 Kafka Producer 需要把 Customer 类的对象序列化成字节数组发送给 Kafka Broker,同时 Kafka Consumer 需要把...

56730
来自专栏程序员的SOD蜜

不使用反射的实体类方案

看过很多ORM的实体类方案,大多是用反射来读数据库数据,这样当频繁操作实体类的时候效率很低,我借鉴了一位朋友的思路,采用.NET 2.0的泛型技术,为实体类提供...

22380
来自专栏风口上的猪的文章

.NET面试题系列[14] - LINQ to SQL与IQueryable

"理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列。" - Jon Skeet

15610
来自专栏张善友的专栏

学习altas笔记[客户端JS和Altas环境初始化关系和DataTable返回数据的客户端处理]

    1、在客户端调用WebService,脚本执行顺序出现了问题(报错了:XXX没有定义!).问题出在Atlas还没有初始化完成.     解决办法Alta...

21780
来自专栏跟着阿笨一起玩NET

.NET常用操作小知识

 var v = StringTruncat("广东省深圳市西乡镇宝安区", 10, "...");

6610
来自专栏前端侠2.0

c# 的析构以及垃圾回收2、3事!

看书时,自己写的例子代码,了解到几个知识点,记载下来。同时发现自己手写代码的能力比较弱,还是得多写一下。

8210
来自专栏小樱的经验随笔

Codeforces 706B Interesting drink

B. Interesting drink time limit per test:2 seconds memory limit per test:256 meg...

30480
来自专栏技术博客

编写高质量代码改善C#程序的157个建议[IEnumerable<T>和IQueryable<T>、LINQ避免迭代、LINQ替代迭代]

本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html 。本文主要学习记录以下内容:

12550
来自专栏木宛城主

浪客剑心:位图法Bitmap算法分析

看了一篇文章《一道腾讯前端试题,谁来试试身手》,正好以前了解过位图法,确实不错。位图法适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不...

38160

扫码关注云+社区

领取腾讯云代金券