详解XML,Object,Json转换与Xstream的使用

详解XML,Object,Json转换与Xstream的使用

XML与对象的相互转换

XML与对象之间的转换是应用中常见的操作之一。Java开发中最常用的方式是使用Java自带的JAXB库或第三方库Xstream来实现。

使用JAXB实现XML与对象的转换

JAXB是Java API for XML Binding(Java API的XML绑定)的简称,它可以将Java对象与XML相互转换。JAXB规范的实现一般由JDK自带,使用JAXB需要在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0.1</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0.1</version>
</dependency>

以下是示例代码:

将Java对象转换成XML格式
@XmlRootElement
public class Student {

    @XmlElement
    private String name;

    @XmlElement
    private int age;

    @XmlElement
    private List<String> courses;

    // 省略getter和setter方法

}
public class XmlUtil {

    public static String toXml(Object obj) throws JAXBException {
        JAXBContext ctx = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = ctx.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter sw = new StringWriter();
        marshaller.marshal(obj, sw);
        return sw.toString();
    }

}
public class Main {

    public static void main(String[] args) throws JAXBException {
        List<String> courses = new ArrayList<>();
        courses.add("Math");
        courses.add("English");
        Student student = new Student();
        student.setName("Tom");
        student.setAge(20);
        student.setCourses(courses);

        String xml = XmlUtil.toXml(student); 
        System.out.println(xml);
    }

}

输出结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<student>
    <name>Tom</name>
    <age>20</age>
    <courses>Math</courses>
    <courses>English</courses>
</student>
将XML格式转换成Java对象
@XmlRootElement
public class Student {

    @XmlElement
    private String name;

    @XmlElement
    private int age;

    @XmlElementWrapper(name="courses")
    @XmlElement(name="course")
    private List<String> courses;

    // 省略getter和setter方法

}
public class XmlUtil {

    @SuppressWarnings("unchecked")
    public static <T> T fromXml(String xml, Class<T> clazz) throws JAXBException {
        JAXBContext ctx = JAXBContext.newInstance(clazz);
        Unmarshaller unmarshaller = ctx.createUnmarshaller();
        StringReader sr = new StringReader(xml);
        return (T)unmarshaller.unmarshal(sr);
    }

}
public class Main {

    public static void main(String[] args) throws JAXBException {
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
                     "<student>\n" +
                     "    <name>Tom</name>\n" +
                     "    <age>20</age>\n" +
                     "    <courses>\n" +
                     "        <course>Math</course>\n" +
                     "        <course>English</course>\n" +
                     "    </courses>\n" +
                     "</student>";

        Student student = XmlUtil.fromXml(xml, Student.class);
        System.out.println(student.getName());
        System.out.println(student.getAge());
        System.out.println(student.getCourses());
    }

}

输出结果:

Tom
20
[Math, English]

使用Xstream实现XML与对象的转换

Xstream是一个Java API,它可以将Java对象与XML相互转换,使用Xstream需要在pom.xml文件中添加依赖:

<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.15</version>
</dependency>

以下是示例代码:

将Java对象转换成XML格式
public class Student {

    private String name;

    private int age;

    private List<String> courses;

    // 省略getter和setter方法

}
public class XmlUtil {

    public static String toXml(Object obj) {
        XStream xstream = new XStream();
        xstream.autodetectAnnotations(true);
        return xstream.toXML(obj);
    }

}
public class Main {

    public static void main(String[] args) {
        List<String> courses = new ArrayList<>();
        courses.add("Math");
        courses.add("English");
        Student student = new Student();
        student.setName("Tom");
        student.setAge(20);
        student.setCourses(courses);

        String xml = XmlUtil.toXml(student);
        System.out.println(xml);
    }

}

输出结果:

<com.example.demo.Student>
  <name>Tom</name>
  <age>20</age>
  <courses>
    <string>Math</string>
    <string>English</string>
  </courses>
</com.example.demo.Student>
将XML格式转换成Java对象
public class Student {

    private String name;

    private int age;

    @XStreamImplicit
    private List<String> courses;

    // 省略getter和setter方法

}
public class XmlUtil {

    @SuppressWarnings("unchecked")
    public static <T> T fromXml(String xml, Class<T> clazz) {
        XStream xstream = new XStream();
        xstream.autodetectAnnotations(true);
        xstream.alias(clazz.getSimpleName(), clazz);
        return (T)xstream.fromXML(xml);
    }

}
public class Main {

    public static void main(String[] args) {
        String xml = "<com.example.demo.Student>\n" +
                     "  <name>Tom</name>\n" +
                     "  <age>20</age>\n" +
                     "  <courses>\n" +
                     "    <string>Math</string>\n" +
                     "    <string>English</string>\n" +
                     "  </courses>\n" +
                     "</com.example.demo.Student>";

        Student student = XmlUtil.fromXml(xml, Student.class);
        System.out.println(student.getName());
        System.out.println(student.getAge());
        System.out.println(student.getCourses());
    }

}

输出结果:

Tom
20
[Math, English]

Java对象与JSON格式相互转换

Java对象与JSON之间的转换也是应用程序中经常要做的操作。Java开发中最常用的方式是使用JSON-lib库来实现。

使用JSON-lib实现Java对象转换成JSON格式

JSON-lib是一个Java的JSON工具包,它可以将Java对象转换成JSON格式数据。在pom.xml文件中添加依赖:

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

以下是示例代码:

public class Student {

    private String name;

    private int age;

    private List<String> courses;

    // 省略getter和setter方法

}
public class JsonUtil {

    public static String toJson(Object obj) {
        JSONObject jsonObject = JSONObject.fromObject(obj);
        return jsonObject.toString();
    }

}
public class Main {

    public static void main(String[] args) {
        List<String> courses = new ArrayList<>();
        courses.add("Math");
        courses.add("English");
        Student student = new Student();
        student.setName("Tom");
        student.setAge(20);
        student.setCourses(courses);

        String json = JsonUtil.toJson(student);
        System.out.println(json);
    }

}

输出结果:

{
    "courses": [
        "Math",
        "English"
    ],
    "age": 20,
    "name": "Tom"
}

使用JSON-lib实现JSON格式转换成Java对象

以下是示例代码:

public class Student {

    private String name;

    private int age;

    @SuppressWarnings("unchecked")
    private List<String> courses;

    // 省略getter和setter方法

}
public class JsonUtil {

    @SuppressWarnings("unchecked")
    public static <T> T fromJson(String json, Class<T> clazz) {
        JSONObject jsonObject = JSONObject.fromObject(json);
        return (T)JSONObject.toBean(jsonObject, clazz);
    }

}
public class Main {

    public static void main(String[] args) {
        String json = "{\n" +
                      "    \"courses\": [\n" +
                      "        \"Math\",\n" +
                      "        \"English\"\n" +
                      "    ],\n" +
                      "    \"age\": 20,\n" +
                      "    \"name\": \"Tom\"\n" +
                      "}";

        Student student = JsonUtil.fromJson(json, Student.class);
        System.out.println(student.getName());
        System.out.println(student.getAge());
        System.out.println(student.getCourses());
    }

}

输出结果:

Tom
20
[Math, English]

XML与JSON之间的转换

XML与JSON之间的转换也是应用程序中常见的操作之一。使用Xstream可以简单地实现XML转JSON和JSON转XML的操作。

以下是示例代码:

XML转JSON
public class Student {

    @XStreamAlias("Name")
    private String name;

    @XStreamAlias("Age")
    private int age;

    @XStreamImplicit(itemFieldName="Course")
    private List<String> courses;

    // 省略getter和setter方法

}
public class XmlJsonUtil {

    public static String xml2Json(String xml) {
        XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
        xstream.registerConverter(new DateConverter("yyyy-MM-dd", new String[0]));
        xstream.processAnnotations(Student.class);
        Student student = (Student)xstream.fromXML(xml);
        return JSON.toJSONString(student);
    }

}
public class Main {

    public static void main(String[] args) {
        String xml = "<Student>\n" +
                     "  <Name>Tom</Name>\n" +
                     "  <Age>20</Age>\n" +
                     "  <Course>Math</Course>\n" +
                     "  <Course>English</Course>\n" +
                     "</Student>";

        String json = XmlJsonUtil.xml2Json(xml);
        System.out.println(json);
    }

}

输出结果:

{"Age":20,"Course":["Math","English"],"Name":"Tom"}
JSON转XML
public class Student {

    private String name;

    private int age;

    private List<String> courses;

    // 省略getter和setter方法

}
public class XmlJsonUtil {

    public static String json2Xml(String json) {
        Student student = JSON.parseObject(json, Student.class);
        XStream xstream = new XStream();
        xstream.autodetectAnnotations(true);
        return xstream.toXML(student);
    }

}
public class Main {

    public static void main(String[] args) {
        String json = "{\"name\":\"Tom\",\"age\":20,\"courses\":[\"Math\",\"English\"]}";

        String xml = XmlJsonUtil.json2Xml(json);
        System.out.println(xml);
    }

}

输出结果:

<Student>
  <name>Tom</name>
  <age>20</age>
  <courses>
    <string>Math</string>
    <string>English</string>
  </courses>
</Student>

Xstream的使用

在以上示例中,我们使用了Xstream来实现XML和JSON与Java对象之间的转换。Xstream可以自动将Java对象转换成相应的XML或JSON格式数据,也可以将XML或JSON格式数据转换成Java对象。

以下是示例代码:

将Java对象转换成XML或JSON格式
public class Student {

    private String name;

    private int age;

    private List<String> courses;

    // 省略getter和setter方法

}
public class XmlJsonUtil {

    public static String toXml(Object obj) {
        XStream xstream = new XStream();
        xstream.autodetectAnnotations(true);
        return xstream.toXML(obj);
    }

    public static String toJson(Object obj) {
        XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
        xstream.useAttributeFor(String.class);
        xstream.autodetectAnnotations(true);
        return xstream.toXML(obj);
    }

}
public class Main {

    public static void main(String[] args) {
        List<String> courses = new ArrayList<>();
        courses.add("Math");
        courses.add("English");
        Student student = new Student();
        student.setName("Tom");
        student.setAge(20);
        student.setCourses(courses);

        String xml = XmlJsonUtil.toXml(student);
        String json = XmlJsonUtil.toJson(student);
        System.out.println(xml);
        System.out.println(json);
    }

}

输出结果:

<Student>
  <name>Tom</name>
  <age>20</age>
  <courses>
    <string>Math</string>
    <string>English</string>
  </courses>
</Student>
{"student":{"name":"Tom","age":20,"courses":{"string":["Math","English"]}}}
将XML或JSON格式转换成Java对象
public class XmlJsonUtil {

    public static <T> T fromXml(String xml, Class<T> clazz) {
        XStream xstream = new XStream();
        xstream.autodetectAnnotations(true);
        xstream.alias(clazz.getSimpleName(), clazz);
        return (T)xstream.fromXML(xml);
    }

    public static <T> T fromJson(String json, Class<T> clazz) {
        XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
        xstream.useAttributeFor(String.class);
        xstream.autodetectAnnotations(true);
        xstream.alias(clazz.getSimpleName(), clazz);
        return (T)xstream.fromXML(json);
    }

}
public class Main {

    public static void main(String[] args) {
        String xml = "<Student>\n" +
                     "  <name>Tom</name>\n" +
                     "  <age>20</age>\n" +
                     "  <courses>\n" +
                     "    <string>Math</string>\n" +
                     "    <string>English</string>\n" +
                     "  </courses>\n" +
                     "</Student>";

        String json = "{\"student\":{\"name\":\"Tom\",\"age\":20,\"courses\":{\"string\":[\"Math\",\"English\"]}}}";

        Student student1 = XmlJsonUtil.fromXml(xml, Student.class);
        Student student2 = XmlJsonUtil.fromJson(json, Student.class);
        System.out.println(student1.getName());
        System.out.println(student1.getAge());
        System.out.println(student1.getCourses());
        System.out.println(student2.getName());
        System.out.println(student2.getAge());
        System.out.println(student2.getCourses());
    }

}

输出结果:

Tom
20
[Math, English]
Tom
20
[Math, English]

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解XML,Object,Json转换与Xstream的使用 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 深入了解MyBatis参数

    深入了解MyBatis参数 MyBatis是一款优秀的数据库持久化框架,在使用过程中主要涉及到参数的设置和传递。深入了解MyBatis参数对于提高MyBatis的性能和灵活性非常重要。 1. 参数的传递 MyBatis支持三种方式的参数传递: 1.1. 单个参数 单个参数是指只传递一个参数,使用最为简单。 Java代码 public interface Us…

    Java 2023年5月20日
    00
  • springboot之配置双kafka全过程

    下面是Spring Boot配置双Kafka全过程的攻略: 1. 添加Kafka依赖 在pom.xml文件中添加以下Kafka依赖: <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</ar…

    Java 2023年5月20日
    00
  • 聊聊Redis的单线程模型

    下面我来详细讲解一下Redis的单线程模型。 Redis的单线程模型 Redis采用单线程模型,每个redis服务进程只有一个线程处理所有客户端的请求。该线程在一个西北曼岛一个时间点处理一个客户端请求,而不是并发处理请求。下面是Redis采用单线程模型的原因: 对于CPU密集型任务,单线程的处理方式可以避免线程间切换所带来的额外开销,提高CPU的利用率; 对…

    Java 2023年5月26日
    00
  • Ubuntu16安装Tomcat8.5和MySQL5.7的教程

    下面是 “Ubuntu16安装Tomcat8.5和MySQL5.7的教程”的完整攻略: 步骤一:安装Tomcat 在终端中输入以下命令以下载Tomcat: sudo apt-get install tomcat8 tomcat8-admin 安装完Tomcat之后,启动它: sudo systemctl start tomcat8 验证是否成功安装Tomca…

    Java 2023年5月19日
    00
  • Java实现获得MySQL数据库中所有表的记录总数可行方法

    下面就来详细讲解“Java实现获得MySQL数据库中所有表的记录总数可行方法”的完整攻略。 1. 方案介绍 在 Java 中,我们可以使用 JDBC(Java Database Connectivity)API 来访问关系型数据库,其中包括 MySQL 数据库。我们可以通过执行 SQL 语句获取 MySQL 数据库中所有表的记录总数,主要有以下两种方法: 1…

    Java 2023年5月20日
    00
  • Java中数字黑洞实现代码

    数字黑洞是指一个数字,如果把它各个位上的数字按照非升序排列得到一个新数,再按照非降序排列得到另一个新数,用第一个数减去第二个数得到的差,之后重复这个过程,最终会得到一个固定的数字6174,这个过程称为Kaprekar常数。 Java中可以通过以下实现代码来模拟这个过程: public static int kaprekar(int num) { int co…

    Java 2023年5月19日
    00
  • Java pom.xml parent引用报错问题解决方案

    针对Java pom.xml parent引用报错问题,下面是完整的解决方案攻略。 问题描述 在Maven项目中,我们经常会在子项目的pom.xml文件中引用父项目的依赖或配置信息。通常使用<parent>元素引用父pom.xml文件的配置。但是,在实际开发过程中,我们可能会遇到以下错误: Project build error: Non-res…

    Java 2023年5月19日
    00
  • 通过Java组合问题看透回溯法

    通过Java组合问题看透回溯法的完整攻略可以分为以下几个步骤: 1. 确定问题模型 首先,我们需要确定问题模型。以Java组合问题为例,问题模型是在给定的n个数字中,任选k个数字,求它们的组合。 2. 定义回溯函数 接下来,我们需要定义回溯函数。回溯函数是实现回溯功能的主要函数。以Java组合问题为例,回溯函数需要有以下参数:- nums:可选数字的集合- …

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部