第十四节 XML与JSON

Python XML 转 JSON,XML 转字典 今天我们将学习如何在 Python 中将 XML 转换为 JSON 和 XML 转换为字典。我们可以使用 Python 的xmltodict模块来读取 XML 文件并将其转换为字典或 JSON 数据。我们还可以在大型 XML 文件上进行流式处理,并将其转换为字典。在进入编码部分之前,让我们首先了解为什么需要进行 XML 转换。 阅读详情

1. XML简介

XML(可扩展标记语言),XML是一个以文本描述数据的文档。

一个XML文档示例

<?xml version="1.0" encoding="UTF-8">
<people>
	<person personid="E01">
		<name>Tony</name>
		<address>10 Downing Street,London,UK</address>
		<tel>(061)98765</tel>
		<fax>(061)98765</fax>
		<email>tony@everywhere.com</email>
	</person>
</people>

2. XML的用途

XML技术的用途:
(1)充当显示数据(以XML充当显示层)
(2)存储数据(存储层)的功能
(3)以xml描述数据,并在服务器与系统的其余部分之间传递(传输数据的一种格式)
从某种角度上讲,xml是一种数据封装和消息传递技术
在这里插入图片描述

3. SAX解析XML

SAX是Simple API for XML的缩写
SAX是读取和操作XML数据更快速、更轻量的方法。SAX允许您在读取文档时处理它,从而不必等待整个文档 被存储下来之后才采取操作。它不涉及DOM所必须的开销和概念跳跃。SAX API是一个基于事件的API,适用于处理数据流,即随着数据的流动而依次处理数据。SAX API在其解析您的文档时发生一定事件的时候会通知您,在您对其响应时,您不作保存的数据将会被抛弃。

SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler,EntityResolver和ErrorHandler。实际上只需继承DefaultHandler类就可以,DefaultHandler实现了这四个事件处理器接口,然后提供了每个抽象方法的默认实现。
//创建SAX解析器工厂对象
SAXParserFactory spf=SAXParserFactory.newInstance();
//使用解析器工厂创建解析器实例
SAXParser saxParser=spf.newSAXParser();
//创建SAX解析器要使用的事件侦听器对象(这个对象需要我们自己来创建要继承DefaultHandler)
PersonHandler handler=new PersonHandler();
//开始解析文件
saxParser.parse(new File(fileName),handler);

利用SAX去解析xml的案例:

<people>
	<person personid="E01">
		<name>Tony</name>
		<address>10 Downing Street,London,UK</address>
		<tel>(061)98765</tel>
		<fax>(061)98765</fax>
		<email>tony@everywhere.com</email>
	</person>
</people>
public class Person {
    public void setPersonid(String personid) {
        this.personid = personid;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    private String personid;
    private String name;
    private String address;
    private String tel;
    private String fax;
    private String email;

    public String getPersonid() {
        return personid;
    }

    @Override
    public String toString() {
        return "Person{" +
                "personid='" + personid + '\'' +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", tel='" + tel + '\'' +
                ", fax='" + fax + '\'' +
                ", email='" + email + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public String getAddress() {
        return address;
    }

    public String getTel() {
        return tel;
    }

    public String getFax() {
        return fax;
    }

    public String getEmail() {
        return email;
    }
}

public class XMLDemo {
    @Test
    public void saxParseXML() throws IOException, SAXException, ParserConfigurationException {
        //1.创建一个SAX解析器工厂对象
        SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
        //2.创建一个SAX解析器
        SAXParser saxParser = saxParserFactory.newSAXParser();
        //3.创建解析器处理对象(需要自己编写)
        PersonHandler personHandler=new PersonHandler();
        //根据上下文获取输入流
        InputStream is = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("person.xml");
        //进行解析
        saxParser.parse(is,personHandler);
        List<Person> persons=personHandler.getPersons();
        for (Person p:persons){
            System.out.println(p);
        }
    }
}


public class PersonHandler extends DefaultHandler {
    /**
     * SAX解析的特点:
     * 1.基于事件驱动
     * 2.顺序读取,速度快
     * 3.不能任意的读取节点(灵活性差)
     * 4.解析时占用的内存小(不会出现内存溢出的情况
     * 5.SAX更适用于在性能要求更高的设备上使用(例如:Android开发中)
     */
    private List<Person> persons=null;
    private Person p;//当前正在解析的Person
    private String tag;//用于记录当前正在解析的标签名

    public List<Person> getPersons() {
        return persons;
    }

    //开始解析文档时调用
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        persons=new ArrayList<>();
        System.out.println("开始解析文档.....");
    }
    //在解析结束的时候调用
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("解析文档结束....");
    }
    //解析开始元素(标签)时调用
    /**
     * @param uri 命名空间
     * @param localName 不带前缀的标签名
     * @param qName  带前缀的标签名
     * @param attributes 当前标签的属性集合
     * @throws SAXException
     * */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        if("person".equals(qName)){
            p=new Person();
            String personid=attributes.getValue("personid");
            p.setPersonid(personid);
        }
        tag=qName;
    }
    //解析结束元素(标签)时调用
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if("person".equals(qName)){
            persons.add(p);
        }
        tag=null;
    }
    //解析文本内容时调用
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        if(tag!=null){
            if("name".equals(tag)){
                p.setName(new String(ch,start,length));
            }else if("address".equals(tag)){
                p.setAddress(new String(ch,start,length));
            }else if("tel".equals(tag)){
                p.setTel(new String(ch,start,length));
            }else if("email".equals(tag)){
                p.setEmail(new String(ch,start,length));
            }else if("fax".equals(tag)){
                p.setFax(new String(ch,start,length));
            }
        }
    }
}

在进行传输的时候尽量的将xml文件弄到一行去,因为减少解析次数,同时缩小文件大小。

4.DOM解析XML

Java解析XML通常有两种方式,DOM和SAX
DOM:文档对象模型
DOM特性:
定义一组Java接口,基于对象,与语言和平台无关将XML文档表示为树,在内存中解析和存储XML文档,允许随机访问文档的不同部分。

DOM解析XML:
DOM优点,由于树在内存中是持久的,因此可以修改后更新。它还可以在任何时候在树中上下导航,API使用起来也比较简单。

解析步骤:
DocumentBuilderFactory builder=DocumentBuilderFactory.newInstance();
DocumentBuilder db=builder.newDocumentBuilder();
db.parse(“person.xml”);
NodeList node_person=doc.getElementsByTagName(“person”);

示例:

 /**
     * DOM解析XML
     * 1.基于树形结构,通过解析器一次性把文档加载到内存中,所以会比较占内存,可以随机访问
     * 更加灵活,更适合在WEB开发中使用
     */
    @Test
    public void domParseXML() throws ParserConfigurationException, IOException, SAXException {
        //1.创建一个DOM解析器工厂对象
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        //2.通过工厂创建解析器对象
        DocumentBuilder documentBuilder = factory.newDocumentBuilder();
        //3.解析文档
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
        //此代码完成后,整个xml文档已经被加载到内存中,以树状存储在内存中
        Document doc = documentBuilder.parse(is);
        //4.从内存中读取数据
        //获取节点名称为person的所有节点,返回节点集合
        NodeList personNodeList = doc.getElementsByTagName("person");
        ArrayList<Person> persons=new ArrayList<>();
        Person p=null;
        for(int i=0;i<personNodeList.getLength();i++){
            Node personNode = personNodeList.item(i);
            p=new Person();
            //获取节点的属性值
            String personid = personNode.getAttributes().getNamedItem("personid").getNodeValue();
            p.setPersonid(personid);
            //获取当前节点的子节点
            NodeList childNodes = personNode.getChildNodes();
            for(int j=0;j<childNodes.getLength();j++){
                Node item = childNodes.item(j);
                String nodeName = item.getNodeName();
                if("name".equals(nodeName)){
                    p.setName(item.getFirstChild().getNodeValue());
                }else if("address".equals(nodeName)){
                    p.setAddress(item.getFirstChild().getNodeValue());
                }else if("tel".equals(nodeName)){
                    p.setTel(item.getFirstChild().getNodeValue());
                }else if("email".equals(nodeName)){
                    p.setEmail(item.getFirstChild().getNodeValue());
                }else if("fax".equals(nodeName)){
                    p.setFax(item.getFirstChild().getNodeValue());
                }
            }
            persons.add(p);
        }
        System.out.println("结果:");
        System.out.println(Arrays.toString(persons.toArray()));
    }

这里的Person类和person.xml与上面的SAX的一样。

5. JDOM解析XML

JDOM是两位著名的Java开发人员兼作者,Brett Mclaughlin和Jason Hunter的创作成果,
2000年初在类似于Apache协议的许可下,JDOM作为一个开源代码项目正式开始研发了。
JDOM简化了与XML的交互并且比使用DOM实现更快,JDOM与DOM主要两方面不同。
首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。
下载地址:http://www.jdom.org/downloads/index.html

使用示例:

    /**
     * 使用JDOM解析XML
     * 1. 与DOM类似,都是基于树型结构
     * 2.与DOM的区别:
     * (1)使用第三方开源的组件
     * (2)实现使用Java的Collections接口
     * (3)效率比DOM更快
     */
    @Test
    public void jdomParseXML() throws Exception {
        //1. 创建JDOM解析器
        SAXBuilder builder=new SAXBuilder();
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
        org.jdom2.Document build = builder.build(is);
        Element rootElement = build.getRootElement();
        List<Person> list=new ArrayList<>();
        Person person=null;
        List<Element> children = rootElement.getChildren();
        for(Element element:children){
            Person p=new Person();
            String personid = element.getAttribute("personid").getValue();
            p.setPersonid(personid);
            List<Element> children1 = element.getChildren();
            for(Element e:children1){
                String tag = e.getName();
                if("name".equals(tag)){
                    person.setName(e.getText());
                }else if("address".equals(tag)){
                    person.setAddress(e.getText());
                }else if("tel".equals(tag)){
                    person.setTel(e.getText());
                }else if("fax".equals(tag)){
                    person.setFax(e.getText());
                }else if("email".equals(tag)){
                    person.setEmail(e.getText());
                }
            }
            list.add(person);
        }
        System.out.println("结果:");
        System.out.println(Arrays.toString(list.toArray()));
    }

6. DOM4J 解析XML

dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在哪方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包,Hibernate用它来读写配置文件。

下载地址:https://dom4j.github.io/

示例如下:

/**
     * 使用DOM4J
     * 1.基于树型结构,第三方组件
     * 2.解析速度快,效率更高,使用JAVA中的迭代器来实现数据读取,在WEB框架中使用较多(比如Hibernate)
     * 
     */

    @Test
    public void dom4jParseXML() throws DocumentException {
        //创建DOM4J的解析器对象
        SAXReader reader=new SAXReader();
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
        org.dom4j.Document doc = reader.read(is);
        org.dom4j.Element rootElement = doc.getRootElement();
        Iterator<Element> iterator = rootElement.elementIterator();
        ArrayList<Person> person = new ArrayList<>();
        Person p=null;
        while (iterator.hasNext()){
            p=new Person();
            org.dom4j.Element e= (org.dom4j.Element) iterator.next();
            p.setPersonid(e.attributeValue("personid"));
            Iterator<org.dom4j.Element> iterator1 = e.elementIterator();
            while (iterator1.hasNext()){
                org.dom4j.Element element = iterator1.next();
                String tag = element.getName();
                if("name".equals(tag)){
                    p.setName(element.getText());
                }else if("address".equals(tag)){
                    p.setAddress(element.getText());
                }else if("tel".equals(tag)){
                    p.setTel(element.getText());
                }else if("fax".equals(tag)){
                    p.setFax(element.getText());
                }else if("email".equals(tag)){
                    p.setEmail(element.getText());
                }
            }
            person.add(p);
        }
        System.out.println("结果:");
        System.out.println(Arrays.toString(person.toArray()));
    }

7. 通过对象生成XML文件

根据对象生成xml文档:
使用java提供的java.beans.XMLEncoder和java.beans.XMLDecoder类。
这是JDK1.4以后才出现的类

步骤:
(1)实例化XML编码器
XMLEncoder xmlEncoder=new XMLEncoder(new BufferedOutputStream(new FileOutputStream(new File(“a.xml”))));
(2)输出对象
(3)关闭
示例如下:

 /**
     * 从xml文件中读取对象
     *
     */
    @Test
    public void xmlDecoder() throws FileNotFoundException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("test.xml")));
        XMLDecoder decoder=new XMLDecoder(bis);
        Person person = (Person)decoder.readObject();
        System.out.println(person);
    }


    /**
     * 把对象转成XML文件写入
     */
    @Test
    public void xmlEncoder() throws FileNotFoundException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("test.xml")));
        XMLEncoder xmlEncoder = new XMLEncoder(bos);
        Person p=new Person();
        p.setPersonid("1110");
        p.setName("liushuai");
        p.setTel("99999");
        p.setEmail("19134189@qq.com");
        p.setFax("0234-899");
        p.setAddress("He Nan Finance university");
        xmlEncoder.writeObject(p);
        xmlEncoder.close();
    }

8. 各种解析方法比较

JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。
SAX表现较好,这要依赖于它特定的解析方式。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
DOM4J是这场测试的获胜者,目前许多开源项目中,大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。
xstream实现XML的转换:
需要下载两个Jar包,一个是xstream-1.4.2.jar另一个是xxp3_min-1.1.4c.jar
下载地址:http://x-stream.github.io/download.html
使用示例:

 /**
     * 使用第三方的xstream实现XML解析与生成
     * xstream常用于服务器传输的时候使用,而前面讲的SAX,DOM,JDOM,DOM4J等一般
     * 是用来进行解析配置文件用,那样比较灵活的获取我们想要的数据,进行过滤
     *
     */
    @Test
    public void xStream(){
        Person p=new Person();
        p.setPersonid("1110");
        p.setName("liushuai");
        p.setTel("99999");
        p.setEmail("19134189@qq.com");
        p.setFax("0234-899");
        p.setAddress("He Nan Finance university");
        XStream xStream = new XStream(new Xpp3Driver());
        //取一个别名
        xStream.alias("Person",Person.class);
        //将一个字段作为属性
        xStream.useAttributeFor(Person.class,"personid");
        String xml = xStream.toXML(p);
        System.out.println(xml);

        //解析XML
        Person person = (Person)xStream.fromXML(xml);
    }

9. JSON简介

JSON是一种轻量级的数据交换格式。JSON官方:http://www.json.org
JSON数据格式的特点
JSON建构于两种结构:
1.“名称/值对”的集合
2.值的有序列表(数组)

JSON表示名称/值对的方式:{“firstName”:“vince”,“lastName”:“ma”,“email”:“finally_m@foxmail.com”}
表示数组
{“user”:[{“firstName”:“vince”,“lastName”:“ma”,“email”:“finally_m@foxmail.com”},{“firstName”:“lin”,“lastName”:“jacks”,“email”:“jacks@qq.com”}]}

10. GSON组件的使用

GSON是Google开发的API,用于转换Java对象和Json对象
下载地址:http://www.mvnrepository.com/artifact/com.google.code.gson/gson
解析JSON:JsonReader reader=new JsonReader(new StringReader(jsonData));
使用示例:

//names.json文件
[
  {"firstName":"vince","lastName":"ma","email":"finally_m@foxmail.com"},
  {"firstName":"lin","lastName":"jacks","email":"jacks@qq.com"}]

//Name对象
public class Name {
    private String firstName;
    private String lastName;
    private String email;

    @Override
    public String toString() {
        return "Name{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                '}';
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public String getEmail() {
        return email;
    }
}

//解析JSON文件
public class JSONDome {
    /**
     * 解析一个JSON数组
     */
    @Test
    public void parseJSONNames(){
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("xmlandjson/names.json");
        InputStreamReader in=new InputStreamReader(is);
        //JSON的解析工具(可以理解为解析器)
        JsonReader reader=new JsonReader(in);
        ArrayList<Name> list=new ArrayList<>();
        try {
            //开始解析数组
            reader.beginArray();
            while (reader.hasNext()){
                list.add(parseName(reader));
            }
            //结束解析数组
            reader.endArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(Arrays.toString(list.toArray()));
    }

    //解析对象Name
    private Name parseName(JsonReader jsonReader) throws IOException {
        Name name=null;
        //开始解析Name对象
        jsonReader.beginObject();
        name=new Name();
        while (jsonReader.hasNext()){
            String attr = jsonReader.nextName();
            if("firstName".equals(attr)){
                name.setFirstName(jsonReader.nextString());
            }else if("lastName".equals(attr)){
                name.setLastName(jsonReader.nextString());
            }else if("email".equals(attr)){
                name.setEmail(jsonReader.nextString());
            }
        }
        jsonReader.endObject();
        return name;
    }
}

解析复杂的JSON文件
示例如下:

//message.json文件
[
  {
    "id": 912345678901,
    "text": "How do I read a JSON stream in Java?",
    "geo": null,
    "user": {
      "name": "json_newb",
      "followers_count": 41
    }
  },
  {
    "id": 912345678902,
    "text": "@json_newb just use JsonReader!",
    "geo": [50.454722, -104.606667],
    "user": {
      "name": "jesse",
      "followers_count": 2
    }
  }
]

public class User {
    private String name;
    private int followers_count;

    public void setName(String name) {
        this.name = name;
    }

    public void setFollowers_count(int followers_count) {
        this.followers_count = followers_count;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", followers_count=" + followers_count +
                '}';
    }

    public String getName() {
        return name;
    }

    public int getFollowers_count() {
        return followers_count;
    }
}

public class Message {
    private long id;
    private String text;

    @Override
    public String toString() {
        return "Message{" +
                "id=" + id +
                ", text='" + text + '\'' +
                ", geo=" + geo +
                ", user=" + user +
                '}';
    }

    private ArrayList<Double> geo;
    private User user;
    public Message(){
    }

    public Message(long id, String text, ArrayList<Double> geo, User user) {
        this.id = id;
        this.text = text;
        this.geo = geo;
        this.user = user;
    }

    public void setId(long id) {
        this.id = id;
    }

    public void setText(String text) {
        this.text = text;
    }

    public void setGeo(ArrayList<Double> geo) {
        this.geo = geo;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public long getId() {
        return id;
    }

    public String getText() {
        return text;
    }

    public ArrayList<Double> getGeo() {
        return geo;
    }

    public User getUser() {
        return user;
    }
}

public class JSONDemo02 {
    @Test
    public void parseJSONMessages() throws IOException {
        //第一步:拿到文件
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("xmlandjson/message.json");
        //将字节流转换为字符流
        InputStreamReader in=new InputStreamReader(is);
        //构造JsonReader对象
        JsonReader jsonReader = new JsonReader(in);
        ArrayList<Message> list = readMessageArray(jsonReader);
        for (Message m:list){
            System.out.println(m);
        }

    }

    //读取Message数组
    private ArrayList<Message> readMessageArray(JsonReader jsonReader) throws IOException {
        ArrayList<Message> list = new ArrayList<>();
        jsonReader.beginArray();
         while (jsonReader.hasNext()){
              list.add(readMessage(jsonReader));
         }
        return list;
    }

    //解析一个Message对象
    private Message readMessage(JsonReader jsonReader) throws IOException {
        Message m=new Message();
        jsonReader.beginObject();
        while (jsonReader.hasNext()){
            String name = jsonReader.nextName();
            if("id".equals(name)){
                m.setId(jsonReader.nextLong());
            }else if("text".equals(name)){
                m.setText(jsonReader.nextString());
                //如果geo为空就不设置了
            }else if("geo".equals(name)&&jsonReader.peek()!= JsonToken.NULL){
                m.setGeo(readerGeo(jsonReader));
            }else if("user".equals(name)){
                m.setUser(readUser(jsonReader));
            }else{
                jsonReader.skipValue();
            }
        }
        jsonReader.endObject();
        return m;
    }

    //解析User对象
    private User readUser(JsonReader jsonReader) throws IOException {
        User u=new User();
        jsonReader.beginObject();
        while (jsonReader.hasNext()){
            String tag = jsonReader.nextName();
            if("name".equals(tag)){
                u.setName(jsonReader.nextString());
            }else if("followers_count".equals(tag)){
                u.setFollowers_count(jsonReader.nextInt());
            }else{
                jsonReader.skipValue();
            }
        }
        jsonReader.endObject();
        return u;
    }

    private ArrayList<Double> readerGeo(JsonReader jsonReader) throws IOException {
        //解析Message里面的Geo
        ArrayList<Double> list=new ArrayList<>();
        jsonReader.beginArray();
        while (jsonReader.hasNext()){
            list.add(jsonReader.nextDouble());
        }
        jsonReader.endArray();
        return list;
    }
}

生成JSON:

    @Test
    public void createJSON(){
        List<Name> list=new ArrayList<>();
        list.add(new Name("vince","ma","1223455@qq.com"));
        list.add(new Name("jack","wang","123456@qq.com"));
        JsonArray array=new JsonArray();
        for (Name n:list){
            JsonObject obj=new JsonObject();
            obj.addProperty("firstName",n.getFirstName());
            obj.addProperty("lastName",n.getLastName());
            obj.addProperty("email",n.getEmail());
            array.add(obj);
        }
        System.out.println(array.toString());
    }

使用Gson直接把JSON数据转换成Java对象,或者把Java对象转换成JSON对象

//把一个Java对象转换成JSON对象或者把一个JSON对象转换成Java
    public Name parseJSON2(String data){
        Gson gson=new Gson();
        Name name=gson.fromJson(data,Name.class);
        return name;
    }

    @Test
    //将json中单个转换为对象
    public Name parseJSON2(){//参数可以为String data
        Gson gson=new Gson();
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("xmlandjson/names.json");
        InputStreamReader in=new InputStreamReader(is);
        Name name = gson.fromJson(in, Name.class);
//        Name name=gson.fromJson(data,Name.class);
        System.out.println(name.toString());
        return name;
    }
//把一个Java对象转换成JSON对象
Gson gson=new Gson();
String json=gson.toJson(new Name("shuai","liu","1234@qq.com"));
System.out.println(json);

使用Gson直接把JSON数组转换成Java对象,或者把多个Java对象转换成JSON数组

@Test
    //将json数组转换成对象
    public List<Name> parseJSON3(){//参数可以为String data
        Type type=new TypeToken<ArrayList<Name>>(){}.getType();
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("xmlandjson/names.json");
        InputStreamReader in=new InputStreamReader(is);
        Gson gson=new Gson();
        List<Name> list=gson.fromJson(in,type);//这里的in可以是Reader,也可以是String data
        System.out.println(Arrays.toString(list.toArray()));
        return list;
    }

//把一个Java对象集合转换成JSON数组
List<Name> list=new ArrayList<>();
list.add(new Name("mingan","hua","11111@qq.com"));
list.add(new Name("qingpeng","liu","3333@qq.com");
Gson gson=new Gson();
String json=gson.toJson(list,typeToken.getType());
System.out.println(json);

11. XML与JSON的比较

通过以下六点比较JSON和XML:
(1)JSON和XML的数据可读性基本相同
(2)JSON和XML同样拥有丰富的解析手段
(3)JSON相对于XML,数据的体积小
(4)JSON与JavaScript的交互更加的方便
(5)JSON对数据的描述性,比XML差
(6)JSON的速度要远比XML快

适合的场景:
(1)数据传输的话:JSON要比XML更有优势
(2)存储数据:XML描述性更强
(3)XML通常用作配置文件(WEB)

JSON与XML的互转 JSON与XML的互转 一、JOSN转XML //json转换成xml public static String jsonToXml(String json){ //输入流 StringReader input = new StringReader(json); //输出流 StringWriter output = ... 阅读详情

相关推荐

mxparser:Xpp3解析器的分支

MXParser MXParser是xpp3_min 1.1.7的fork,仅包含具有Plexus fork合并更改的解析器。 它是XMLPULL V1 API(仅解析器)的实现。 Xpp3曾经由Extreme提供! 印第安纳大学实验室。 但是,该项目的网站,存储库和文档早已从其服务器上消失了。 尽管原始作者在GitHub的存储库中进行了设置,但他不再响应,并且维护的派生无法使用现有Maven坐标将其版本发布到Maven Central。 自开始以来,Xpp3一直是XStream的默认解析器,由于某些特殊行为,由于兼容性问题,不能简单地对其进行更改。 叉子修复了多个错误,其中一些错误已在十多年前被报告。 二进制文件 生成的Java库可在Maven Central中获得:io.github.x-stream:mxparser 文献资料 文档也可以在。 这包括: Java文档 变更记录

XStream 用法详解 java 类与 XML 互换

首先是例子entity类 Person; Java代码   "white-space: normal; background-color: #ffffff;">package com.xstream.entity    import com.thoughtworks.xstream.annotations.XStreamAlias;  import com.thoughtwor

fanlulu2015的博客 474

IsaacLab从入门到精通(二) 导入自定义机器人

IsaacLab系列第二讲,导入自定义的机器人及设置

DejaWu33的博客 8469

java.lang.NoClassDefFoundError: org/xmlpull/mxp1/MXParser

java.lang.NoClassDefFoundError: org/xmlpull/mxp1/MXParser

王者丶丿风范 1092

树莓派4B之OpenCV人脸识别实战:从Haar Cascade到实时检测(保姆级教程)

本教程详细介绍了如何在树莓派4B上部署OpenCV,并利用Haar Cascade算法实现实时人脸识别。内容涵盖从系统环境搭建、算法原理解析到代码逐行讲解与实战调优,为嵌入式AI和计算机视觉初学者提供了一份完整的保姆级实践指南。

p8q9r0的博客 402

ANSYS 12.1避坑全记录:当Win7+VMware14遇到FLEXlm报错时的自救指南

本文详细介绍了在Windows 7和VMware14环境下安装和运行ANSYS 12.1时遇到的FLEXlm报错问题及其解决方案。通过虚拟机技术隔离时间同步问题,提供从环境配置到许可证管理的完整指南,帮助用户稳定运行这一老旧版本的工程仿真软件。

tt34567的博客 644

java 对象转xml_Java bean与xml 互转(对象转xml、xml转对象)

importorg.jdom2.Document;importorg.jdom2.Element;importorg.jdom2.input.SAXBuilder;importorg.jdom2.output.Format;importorg.jdom2.output.XMLOutputter;import java.io.*;importjava.lang.reflect.Field;impor...

weixin_39834205的博客 438

Win10蓝屏代码critical process died的解决方法

critical process died”蓝屏错误是Win10操作系统中较为常见的问题之一。当遇到这一问题时,可以尝试通过修复当前系统、检查硬盘槽位或重新安装系统等方法来解决。本文详细介绍了这三种方法的操作步骤和注意事项,希望能帮助大家摆脱这一困扰。同时,也建议大家在日常使用中注意系统的维护和更新,以减少类似问题的发生。

mmoo_python的博客 9536

JDOM读取XML,并且创建XML

package com.brit.cx.common; import java.io.ByteArrayInputStream; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.L...

Mr.Cheney的专栏 253

第1期技术: DQN算法原理及实现过程

利用神经网络近似值函数的方法表示为: V^(s,w)≈Vπ(s)q^(s,a,w)≈qπ(s,a) \hat{V}(s, w) \approx V_{\pi}(s) \\ \hat{q}(s, a, w) \approx q_{\pi}(s, a) V^(s,w)≈Vπ​(s)q^​(s,a,w)≈qπ​(s,a) 那么具体的工作过程是怎样实现的? 以及如何从端到端的过程,本文将讲解Deep Q Network(DQN, 而这正是由DeepMind于2013年和2015年分别提出的两篇论文《Playi

深度强化学习实验室:一个“开源开放、共享共进”的强化学习学术组织。 4955

FPGA波束形成:从算法到硬件的艺术之旅

本文深入探讨了FPGA在波束形成技术中的应用,从算法原理到Verilog硬件实现的全过程。文章详细分析了FPGA并行处理、低延迟和可重构特性如何优化波束形成系统性能,并提供了Verilog关键模块代码示例和资源优化策略,为工程师实现高效FPGA波束形成解决方案提供实用指导。

tea88的博客 1046

JSON与XML的区别比较

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

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 7万+

Android 13 系统定制:实现第三方Launcher预置与原生Launcher3的共存切换

本文详细介绍了在Android 13系统中实现第三方Launcher预置与原生Launcher3共存切换的技术方案。通过修改ResolverActivity逻辑、处理首次启动设置以及优化用户切换机制,开发者可以灵活定制默认Launcher,同时保留用户自由选择权。文章还提供了常见问题排查指南和性能优化建议,帮助提升双Launcher方案的稳定性和用户体验。

weixin_30275415的博客 127

(详解)XML与JSON的互相转换

XML与JSON的互相转换 文章目录XML与JSON的互相转换1. XML转JSON1.1 代码目的1.2 代码实现2. JSON转XML3. JSON转XML并输出成指定的文件4. 主要的pom.xml配置如下5. 整体代码 1. XML转JSON 1.1 代码目的 实现xml与json的互相转换,先实现xml -> json, 然后实现json -> xml字符串,最后xml字符...

AaronCao 2万+

彻底讲透 SAP 中的 client-safe:从 CDS、AMDP 到 ABAP Cloud 的客户端隔离设计

SAP系统中的client-safe概念定义了技术边界:访问client-dependent数据的对象必须确保只看到单个client数据,而访问client-independent数据的对象则天然满足条件。这一原则直接影响CDS视图、AMDP等核心组件,并与ABAP Cloud开发模型紧密集成。在业务系统中,client isolation要求用户只能看到当前登录client的数据。SAP通过语言版本、对象规则和静态检查强制执行这一约束,特别是在ABAP Cloud开发中,AMDP方法和发布的API必须满足

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3268

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

xml与json的区别,总结

JSON和XML的比较   ◆可读性   JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。  ◆可扩展性   XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,而JSON却不能。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。  ◆编码难度   XML有丰富的编码工具,

sanpintian的专栏 7万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

第十四章、Groovy中XML与JSON使用

文章目录1、读取XML文档1.1、使用DOM解析1.2、使用groovy解析1.3、使用SAX解析1.4、使用StAX解析文档(Streaming API For XML)2、处理XML2.1、一处处理2.2、流处理2.3、更新XML2.4、使用XPath合并3、解析和建立JSON3.1、解析JSON3.2、构建JSON4、总结 1、读取XML文档 1.1、使用DOM解析 节点类型: ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE java解析xml文件 //ja

往前的娘娘 1291

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【JSON】JSON概述,JSON与XML的异同,JSON语法,JSON与Java的相互转换

【JSON】JSON概述,JSON与XML的异同,JSON语法,JSON与Java的相互转换1. 什么是JSON?2. 与XML的异同3. 为什么使用JSON4. JSON语法4.1 基本规则4.2 获取数据5. JSON数据和Java对象的相互转换5.1 Java对象转换JSON5.2 JSON对象转换Java 1. 什么是JSON? JSON(JavaScript Object Notatio...

来日浅谈的博客 2509

JSON与XML怎么选?什么情况下会用到 JSON?

JSON 以其 “轻量、通用、灵活” 的特性,成为数据交互的 “基础设施”。它解决了跨语言通信的核心问题,降低了系统集成的复杂度,让数据在不同技术栈、不同设备之间自由流动。

Kooboo_china的博客 5928

【Python】轻松解析JSON与XML:Python标准库的json与xml模块

特性JSONXML结构简单的键值对结构标签和属性结构,支持复杂层次可读性易读,结构简洁读写稍复杂,适合结构化数据文件体积通常较小较大,含有标签冗余解析性能快速相对较慢,适合静态数据Python解析模块json应用场景API、配置、轻量级数据交换配置文件、复杂数据存储、文档管理本博客介绍了Python标准库中json和模块的核心功能及应用场景。json模块让我们能够高效处理JSON格式的数据,而提供了XML解析和生成的基本操作。

萧鼎的博客 1781

JSON与XML的区别与联系

(一)JSON与XML的区别:   (1)可读性方面:基本相同,XML的可读性比较好;   (2)可扩展性方面:都具有良好的扩展性;   (3)编码难度方面:相对而言,JSON的编码比较容易;   (4)解码难度:JSON的解码难度基本为零,XML需要考虑子节点和父节点;   (5)数据体积方面:JSON相对于XML来讲,数据体积小,传递的速度比较快;   (6)数据交互方面:JSON

ljyanlj的博客 1万+

【4-8】《XML与JSON》——XML、解析XML、SAX、DOM4J、XStream、JSON、Gson、Fastjson

文章目录XML与JSON一、XML1、XML概述1.XML语法格式2.语法进阶CDATA(了解)2、解析XML1.SAX解析2.DOM解析3.JDOM解析4.DOM4J解析3、DOM4J解析XML(掌握)1.文档对象 Document2.元素对象 Element3.DOM4J解析XML案例4.DOM4J-XPATH解析XML4、Java生成XML(熟悉)5、XStream的使用(了解)二、JSON1、什么是JSON2、JSON解析1.Gson2.Fastjson XML与JSON 一、XML 1、XML概述

程序媛乐园 947

XML是什么 XML与JSON的区别

一、XML是什么?    1、xml常用于数据存储和传输,文件后缀为 .xml;    2、它是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言。    3、XML设计用来传送及携带数据信息,不用来表现或展示数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。而HTML语言则用来表现数据二、XML结构【倒长的树型结构】  &lt; &g...

DuTianTian_csdn的博客 3981

XML、JSON的相互转化以及XML概述

一、XML XML,是指可扩展标记语言,其作用主要用来传输和存储数据,而HTML主要用来显示数据。XML标签并未被预定义,这意味着,XML标签都是自定义的,且XML具有两个重要的特点—XML的文档类型与XML的可移植性(都采用了Unicode标准的编码系统)。故而,当需要调用第三方接口时(参数为XML形式),我们需要知道第三方的xml标签、层结构。通过XML,数据能够存储在独立的X...

Abel_01_xu的博客 1530

Python的JSON与XML处理

1.背景介绍 Python是一种强大的编程语言,它具有简洁的语法和易于学习。在现代软件开发中,Python被广泛使用,尤其是在处理数据和文件格式方面。JSON和XML是两种常见的数据交换格式,它们在Web开发、数据存储和通信中都有广泛的应用。本文将介绍Python如何处理JSON和XML数据,以及它们之间的区别和联系。 2.核心概念与联系 2.1 JSON JSON(JavaScript ...

AI天才研究院 1391

Xml 与 JSON 解析

xml 1.XML概述 1.什么是XML? XML (eXtensible Markup Language)指可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。 XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被预定义。您需要自行定义标签。 XML 被设计为具有自我描述性。 XML 是 W3C 的推荐标准 xml是一种非常灵

alwayschw的博客 1790
上一篇: 第十三节 Java 枚举与注解
下一篇: Java Web 基本概念
_乐颜
博客等级 码龄7年 15粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值