`
kjkhi
  • 浏览: 184816 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

XStream处理null值的问题

阅读更多
使用XStream把javaBean转化成xml文件时,当JavaBean的某些变量为null是,将在xml文件中不输出这个属性!如
Class Person{

        String name;
        String sex;
}

当sex为null时,那么输出的xml文件为
<person>
     <name>***</name>
</person>

如果我们希望能把全部变量输出,需要给XStream实例注册一个转化器,实现Converter接口,这个接口提供三个方法,在它的官方文档中有详细介绍。http://xstream.codehaus.org/javadoc/index.html


这里我们需要实现的功能是,把null值的属性都在xml文件中输出!如上面的Person输出为
<person>
      <name>***</name>
      <sex></sex>
</person>

那么我们需要新建一个实现Converter接口的类,如
package com.asrfid.jay.action;

import java.lang.reflect.Method;
import java.util.List;

import com.asrfid.jay.dto.Consignee;
import com.asrfid.jay.dto.Consignor;
import com.asrfid.jay.dto.Goods;
import com.asrfid.jay.dto.SendXML;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class NullConverter implements Converter{

	@Override
	public void marshal(Object source, HierarchicalStreamWriter writer,
			MarshallingContext context) {
		SendXML obj = (SendXML)source;
		
		Method[] methods = SendXML.class.getMethods();
		for(Method m : methods){
			String methodName = m.getName();
			if (methodName.indexOf("get") != -1 && methodName != "getClass") {
				String name = methodName.substring(3);
				Object o = null;
				try {
					o = m.invoke(obj, new Object[0]);
				} catch (Exception e) {
					e.printStackTrace();
				}
				if (o instanceof Consignee) {
					writer.startNode("ConsigneeInfomation");
					Consignee consignee = (Consignee)o;
					Method[] methods2 = Consignee.class.getMethods();
					for (Method m2 : methods2) {
						methodName = m2.getName();
						if (methodName.indexOf("get") != -1 && methodName != "getClass") {
							name = methodName.substring(3);
							writer.startNode(name);
							Object con1 = null;
							try {
								con1 = m2.invoke(consignee, new Object[0]);
							} catch (Exception e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							writer.setValue(con1==null?"":con1.toString());
							writer.endNode();
						}
					}
					writer.endNode();
				}else if (o instanceof Consignor) {
					writer.startNode("ConsignorInfomation");
					Consignor consignor = (Consignor)o;
					Method[] methods2 = Consignor.class.getMethods();
					for (Method m2 : methods2) {
						methodName = m2.getName();
						if (methodName.indexOf("get") != -1 && methodName != "getClass") {
							name = methodName.substring(3);
							writer.startNode(name);
							Object con1 = null;
							try {
								con1 = m2.invoke(consignor, new Object[0]);
							} catch (Exception e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							writer.setValue(con1==null?"":con1.toString());
							writer.endNode();
						}
					}
					writer.endNode();
				}else if(o instanceof java.util.List){
					writer.startNode("goodsInformations");
					List lists = (java.util.List)o;
					for(int i =0;i<lists.size();i++){
						Goods goods = (Goods)lists.get(i);
						Method[] methods3 = Goods.class.getMethods();
						for (Method m3 : methods3) {
							methodName = m3.getName();
							if (methodName.indexOf("get") != -1 && methodName != "getClass") {
								name = methodName.substring(3);
								writer.startNode(name);
								Object con1 = null;
								try {
									con1 = m3.invoke(goods, new Object[0]);
								} catch (Exception e) {
									e.printStackTrace();
								}
								writer.setValue(con1==null?"":con1.toString());
								writer.endNode();
							}
						}
					}
					writer.endNode();//goodsInformations
				}else {
					writer.startNode(name);
					writer.setValue(o==null?"":o.toString());
					writer.endNode();//
				}
				
				
			}
		}
		
	}

	@Override
	public Object unmarshal(HierarchicalStreamReader reader,
			UnmarshallingContext context) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean canConvert(Class type) {
		// TODO Auto-generated method stub
		return type.equals(SendXML.class);
	}

}

另外我们还需要注册这个类,如
		SendXML sendXML = this.sendXMLManager.getSendXML(shippingId);
		XStream xStream = new XStream(new DomDriver());
		xStream.alias("ShippingOrder", SendXML.class);
		xStream.alias("consigneeInfomation", Consignee.class);
		xStream.alias("consignorInfomation", Consignor.class);
		xStream.alias("GoodsInfomation", Goods.class);
		xStream.registerConverter(new com.asrfid.jay.action.NullConverter());
		String xml = xStream.toXML(sendXML);
0
0
分享到:
评论
1 楼 rxcss66 2012-08-11  
你好方便留下联系方式么,关于Xstream处理null值的问题有些疑问。QQ:525956272 email:rxcss666@163.com

相关推荐

    xstream-1.4.19.jar

    xstream-1.4.19.jar

    XStream的Date转换 @XStreamConverter DateConverter

    在处理日期时,XStream默认的转换策略可能无法满足所有需求,例如默认格式可能不符合项目规范,或者需要处理时区问题。这时,我们可以自定义一个DateConverter,用`@XStreamConverter`注解标记,以替换默认的转换器...

    com.thoughtworks.xstream.XStream操作XML和java对象的一些用法

    对于Map集合,XStream会使用键作为XML标签,值作为内容: ```java Map, String&gt; map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); String xmlMap = xstream.toXML(map); ``` ...

    xstream-1.4.15.jar

    Xstream上次对CVE-2020-26217处理并不彻底,虽然通过黑名单方法阻止了远程代码执行,但是仍然可以采用类似思路实现文件删除与服务器请求伪造。 影响版本 Xstream 修复版本 Xstream &gt; = 1.4.15 风险等级 严重

    xstream-1.4.2.jar

    6. **流式处理**:XStream可以将XML解析为事件流,这对于处理大型XML文件时可以节省内存。 7. **支持JSON**:除了XML,XStream还支持JSON格式的数据交换,使得与JavaScript和Web服务的交互更为便捷。 在实际应用中...

    最齐全的xstream1.4.8.jar

    最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar ...

    xStream完整Jar包

    “xStream完整Jar包”提供了 XStream 库的完整功能,使得开发者能够方便地处理 XML 与 Java 对象之间的转换。无论是在数据交换、存储还是序列化需求中,XStream 都是一个值得信赖的工具,尤其适合那些寻求简洁代码和...

    使用XStream是实现XML与Java对象的转换(4)--转换器

    如果你需要保留这些信息,可以通过转换器来控制null值的序列化。 总之,XStream的转换器功能为我们提供了高度的灵活性,可以定制XML与Java对象之间的转换逻辑,以满足各种需求。正确地使用转换器,不仅可以提高代码...

    xstream解析依赖包

    例如,XStream提供了内置的转换器处理基本类型、集合、日期等,同时也支持用户自定义转换器以处理特定的复杂对象。 XStream-1.3.1版本是一个相对早期的稳定版本,它包含了对JDK1.4及以上的支持,同时提供了许多增强...

    Oracle Database XStream Guide 11g Release 2 (11.2)-302

    * XStream 的管理和监控工具可以帮助用户快速定位和解决问题。 * XStream 的管理和监控工具可以集成到 Oracle 企业管理器中,提供统一的管理界面。 Oracle Database XStream 是一个功能强大且灵活的数据捕获和事件...

    xstream1.4.15.JAR

    XStream 在其早期版本中就存在这样的问题,因为它允许不受限制的反序列化,没有对输入数据进行足够的验证。 XStream 1.4.15 版本的更新主要目的是解决这些安全问题。开发者引入了新的安全特性,比如默认禁止不受...

    xstream-1.3.1.zip

    1. 自动类型检测:XStream能够自动识别并处理各种基本类型的Java对象,如字符串、数字、日期等,无需额外配置。 2. 自定义转换器:如果默认的自动映射不能满足需求,用户可以通过自定义转换器来控制特定类的XML表示...

    xstream最新版 - xstream-1.4.18.jar

    xstream最新版jar包

    XStream+1.3(xstream).CHM

    4. **XML命名空间支持**:在处理XML文档时,XStream可以处理XML命名空间,这对于解析符合XML标准的复杂文档至关重要。 5. **流式处理**:XStream支持流式处理XML,这意味着可以边读取XML边构建Java对象,或者边序列...

    Xstream 相关jar包

    3. **自动类型转换**:Xstream支持自动类型转换,这意味着即使XML中的值是字符串类型,也能正确地转换回对应的Java类型,如日期、数字等。 4. **自定义转换器**:对于标准转换器无法处理的复杂对象或自定义类型,...

    xstream-1.4.8最齐全的jar包

    5. **集合处理**:XStream能够自动处理Java集合(如List、Set)和数组,将它们转换成XML的元素列表。 6. **命名空间支持**:XStream可以处理XML的命名空间,方便在复杂的XML文档结构中工作。 7. **安全性**:...

    Java用xStream拼接xml

    当需要将数据转换为XML格式以便于传输或处理时,工具如xStream就显得尤为重要。Java中的xStream库提供了一个简单易用的方式来将Java对象序列化为XML,反之亦然,即反序列化XML回Java对象。 **xStream简介** xStream...

    xstream相关的jar包

    XStream是一款强大的Java库,用于将Java对象序列化为XML,反之亦然。这个库的主要优点在于其简单易用的API和对复杂对象图的处理能力...在实际开发中,理解和掌握这些知识点对于有效地利用XStream进行数据处理至关重要。

    xstream学习文档及实例

    通过深入学习和实践,开发者可以充分利用 XStream 提供的功能,提升项目中的数据处理效率。在阅读“xstream学习文档”时,建议重点理解其核心概念、使用示例以及自定义转换器的编写,以便在实际工作中游刃有余地应对...

Global site tag (gtag.js) - Google Analytics