`
kjkhi
  • 浏览: 187168 次
  • 性别: 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是实现XML与Java对象的转换(4)--转换器

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

    xstream-distribution-1.4.15-bin.zip

    - **自定义XML输出**:开发者可以通过配置或者使用Annotated Classes来控制XML的生成,如字段的命名、顺序以及是否省略null值等。 - **安全的序列化**:XStream提供了一种安全模式,可以防止恶意代码通过XML序列...

    poi读取Excel2007文件

    - 解析和修改Excel文件中的数据,如读取单元格值、设置公式、处理样式和格式。 - 可能会涉及到使用Xalan进行数据转换,或者使用XMLBeans进行XML与Java对象之间的映射。 - 如果涉及安全性,可能还会介绍如何利用...

    Spring.3.x企业应用开发实战(完整版).part2

    4.4.4 null值 4.4.5 级联属性 4.4.6 集合类型属性 4.4.7 简化配置方式 4.4.8 自动装配 4.5 方法注入 4.5.1 lookup方法注入 4.5.2 方法替换 4.6 之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 ...

    Spring3.x企业应用开发实战(完整版) part1

    4.4.4 null值 4.4.5 级联属性 4.4.6 集合类型属性 4.4.7 简化配置方式 4.4.8 自动装配 4.5 方法注入 4.5.1 lookup方法注入 4.5.2 方法替换 4.6 之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 ...

    xml-master_jason_xml_

    一个JSON对象用大括号`{}`包围,键值对之间用逗号分隔,键是字符串,用双引号包围,值可以是各种数据类型,如字符串、数字、布尔值、数组、null,或者另一个JSON对象。例如:`{"key": "value", "anotherKey": 42}`。...

Global site tag (gtag.js) - Google Analytics