XStream解析xml和json

XStream是一個在我看來比較好的一個第三方包了。因爲它在解析時支持註解、這樣很是方便,並且xml跟json這兩種格式的文件都能進行解析,XStream本屬於java的一個第三方包,甚是好用,若是拿它在android開發環境,也是能正常解析,但有點美中不足,因爲android開發環境時,XStream不太支持json轉對象,只支持對象轉json,其他xml與對象的互轉都支持。這樣的話雙解析就有了那麼一點瑕疵之處,不過話說回來,沒多少需求的數據交互會用json跟xml切來切去的,當只是json轉對象時,可以用Gson.jar或Jsonlib.jar或其他的json解析。XStream.jar能支持註解,又支持xml和json雙解析就已經很好了。


首先來了解註解的基本使用方法:

註解
@XStreamAlias別名註解
作用目標: 類,字段


@XStreamImplicit 隱式集合
@XStreamImplicit(itemFieldName="part")
作用目標: 集合字段


@XStreamConverter(SingleValueCalendarConverter.class) 注入轉換器
作用目標: 對象


@XStreamAsAttribute 轉換成屬性
作用目標: 字段


@XStreamOmitField 忽略字段
作用目標: 字段


Auto-detect Annotations 自動偵查註解
xstream.autodetectAnnotations(true);


看下面的例子:

Student.java實體類

@XStreamAlias("Student")
public class Student implements Serializable{
	
	private static final long serialVersionUID = 1L;

	@XStreamAlias("name")
	private String name;
	
	@XStreamAlias("sex")
	private String sex;
	
	public Student(){
		
	}
	
	public Student(String name,String sex){
		this.name = name;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

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

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
	
	
	@Override
	public String toString() {
		return getClass().getSimpleName() + ":{"+"name:" + name +",sex:" + sex+"}";
	}
	

}


	/**
	 * xml轉bean
	 * @param xml
	 * @param clazz
	 * @return
	 */
	public static <T> T xmlToBean(String xml,Class<T>... clazz){
		
		T t = null;
		
		XStream xStream = new XStream(new Dom4JDriver()){    //xml轉對象需要用到dom4j.jar包

			@Override
			protected MapperWrapper wrapMapper(MapperWrapper next) {
				return new MapperWrapper(next) {

					@Override
					public boolean shouldSerializeMember(Class definedIn,
							String fieldName) {
						
						if(definedIn == Object.class){
							try{
								return this.realClass(fieldName)!=null;
								
							}catch(Exception e){
								return false;
							}
						}
						
						return super.shouldSerializeMember(definedIn, fieldName);
					}
					
					
				};
			}
			
		};
		
		xStream.setMode(XStream.NO_REFERENCES);
		xStream.processAnnotations(clazz);
		
		t = (T)xStream.fromXML(xml);
		
		return t;
	}



	/**
	 * json轉bean
	 * @param json
	 * @param clazz
	 * @return
	 */
	public static <T> T jsonToBean(String json,Class<T>... clazz){
		
		T t = null;
		
		XStream xStream = new XStream(new JettisonMappedXmlDriver()){    //json轉對象時需要用到jettison.jar包

			@Override
			protected MapperWrapper wrapMapper(MapperWrapper next) {

				return new MapperWrapper(next) {

					@Override
					public boolean shouldSerializeMember(Class definedIn,
							String fieldName) {
						
						if(definedIn == Object.class){
							try{
								return this.realClass(fieldName)!=null;
								
							}catch(Exception e){
								return false;
							}
						}
						
						return super.shouldSerializeMember(definedIn, fieldName);
					}
					
					
				};
			
			}
			
		};
		
		xStream.setMode(XStream.NO_REFERENCES);
		xStream.processAnnotations(clazz);
		
		t = (T)xStream.fromXML(json);
		
		return t;
	}


main方法測試代碼:

	public static void main(String[] args) {

		String json = "{'Student':{'name':'張三','sex':'男'}}";
		Student student1 = jsonToBean(json,Student.class);
		System.out.println(student1.toString());
		
		String xml = "<?xml version='1.0' encoding='utf-8'?><Student><name>李四</name><sex>女</sex></Student>";
		Student student2 = xmlToBean(xml,Student.class);
		System.out.println(student2.toString());
		
		
	}

打印結果如下:

Student:{name:張三,sex:男}
Student:{name:李四,sex:女}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章