返回介绍

XML,Object,Json 转换之浅析 Xstream 的使用

发布于 2025-02-26 12:59:34 字数 4038 浏览 0 评论 0 收藏 0

XML,Object,Json 转换之浅析 Xstream 的使用

请尊重他人的劳动成果,转载请注明出处: XML,Object,Json 转换之浅析 Xstream 的使用

XStream 的是一个简单的库,主要用于 Java 对象和 XML 之间的转换。但 XStream 也内置了对 Json 的支持。

1.Xstream 的特点:

这里直接引用 Xstream 官方的叙述:

  • 灵活易用: 在更高的层次上提供了简单、灵活、易用的统一接口,用户无需了解项目的底层细节
  • 无需映射: 大多数对象都可以在无需映射的情况下进行序列化与反序列化的操作
  • 高速稳定: 设计时力求达到的最重要的指标是解析速度快、占用内存少,以使之能够适用于大的对象处理或是对信息吞吐量要求高的系统
  • 清晰易懂: 项目采用 reflection 机制得到无冗余信息的 XML 文件。所生成的 XML 文件较本地 Java 序列化产物更简洁,格式更清晰,更便于用户阅读
  • 无需修改: 完全序列化包括 private 和 final 类型在内的全部内部字段。支持非公有类和内部类,类可以没有缺省的构造函数
  • 易于集成 :通过实现特定的接口,XStream 可以直接与其它任何树型结构进行序列化与反序列化操作(而不仅仅是 XML 格式)
  • 灵活转换: 转换策略是可以定制的,允许用户自定义特殊类型的对象如何以 XML 格式存储。
  • 错误处理: 由于 XML 资料不合法而造成异常时,会提供详细地诊断信息帮助处理问题。

2.初始化 XStream 类

说 Xstream 简单是因为它提供统一入口,主要类 XStream 用作所有项目的入口点。它将重要组件集成在一起,提供更简单易用的 API 操作。

我们可以使用以下的语句进行初始化操作:

XStreamxstream = new XStream();

默认情况下,XStream 会采用 Xpp3 库,XPP3 是一种运行效率非常高的 XML 全解析实现。如果你不想依靠 Xpp3 库的话,也可以使用一个标准的 JAXP DOM 解析器,可以采用以下语句进行初始化:

// 不使用 XPP3 库
XStreamxstream = new XStream(new DomDriver());

此 xstream 实例,为线程安全的,可以供多个线程进行调用,共享使用。参考 com.thoughtworks.xstream.io.xml 包,会发现系统提供了多种标识解析器供我们选择,包括,DomDriver、 JDomDriver、StaxDriver 等等。

前面提到了 Xstream 提供了对 Json 的支持,是因为 Xstream 内置了两个 Driver:

  • JsonHierarchicalStreamDriver:不依赖其他类库,只实现 obj->JSON
  • JettisonMappedXmlDriver:依赖 jettison 类库,实现 JSON->obj or obj->JSON

两种 Driver 在处理相同设置的 Object 时会得到不同的 JSON 串,JsonHierarchicalStreamDriver 得到的串更简洁,确如官网所说。

JsonHierarchicalStreamDriver 有个小问题——默认输出带格式的 JSON 串,结构中带空格、换行,并且没有提供修饰方式。

3.常用方法:

  • xStream .toXML(object):将对象转换成 XML、Json。
  • xStream .toXML(obj, outputStream):将对象转换 XML、Json 并封装成输出流。
  • xStream .toXML(object, writer):将对象转换 XML、Json 并封成写入流。
  • xStream .fromXML():将 XML、Json 转换成对象,此方法接受 File、InputStream、Reader、String、URL 类型的参数。
  • xStream .alias("news", News. class ):为指定类名创建别名。
  • xStream .useAttributeFor(News. class ,"id"):将 id 设为 News 的元素的属性。
  • xStream .aliasField("other", BookShelf. class ,"remark"):修改节点名称,将 BookShelf 类中的 remark 节点名修改为 other。
  • xStream .addImplicitCollection(BookShelf. class ,"books"):去掉集体节点的父节点。
  • xStream .aliasAttribute("姓名","name"):修改属性的 name,为姓名。

4.实例 1:将对象转换成 XML

 /**
   * 将对象转换成 Xml 格式的字符串
   * @param object 要转换成 Xml 的对象
   * @return String:Xml 格式的字符串
   */
  public static String convertObject2Xml(Object object) {
     xStream=new XStream();
     xStream.alias("news", News.class);//修改元素名称
     xStream.useAttributeFor(News.class, "id");//将 id 设为 News 的元素的属性
     return xStream.toXML(object);   
  }

5.实例 2:将 XML 象转换成对象

/**
   * 将成 Xml 格式的字符串转换成 Java 对象
   * @param inputStream 要转换成 Java 对象的 inputStream
   * @return String:Xml 格式的字符串
   */
  public static Object convertXml2Object(InputStream inputStream) {
     xStream=new XStream();
     xStream.alias("news", News.class);//修改元素名称
     xStream.useAttributeFor(News.class, "id");//将 id 设为 News 的元素的属性
     return  xStream.fromXML(inputStream);//此方法也可将 xml 转换成 map
  }

6.实例 3:将对象转换成 Json

/**
   * 将对象转换成 Json 格式的字符串
   * @param object 要转换成 Json 的对象
   * @return String:Json 格式的字符串
   */
  public static String convertObject2Json(Object object) {    
       xStream = new XStream(newJsonHierarchicalStreamDriver() {
      publicHierarchicalStreamWriter createWriter(Writer out) {
        //删除根节点
         return new JsonWriter(out, JsonWriter.DROP_ROOT_MODE);
      }
     });   
     return xStream.toXML(object);   
  }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文