牛骨文教育服务平台(让学习变的简单)

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43194015

从这篇博客开始第二大部分就算正式开始了,不过在介绍搜索后台之前,还是先介绍写可能使用的大工具类,这样在后面的搜索后台介绍中,就不会穿插其他的内容介绍。这篇就主要介绍两个工具类:json、xml格式数据处理类。

JSON
在前后台数据通信过程中,json数据格式是一种比较常用的方式。将javabean转化为json格式字符串,可以通过简单的字符串拼接,也可以使用第三方jar包进行处理,这里介绍的类也是基于第三方jar包实现的。代码实现如下:

 /**  
 *@Description:    json数据工具
 */ 
package com.lulei.util;  

import java.io.IOException;
import java.util.HashMap;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
  
public class JsonUtil {
	
	public static final String NO_DATA = "{"data":null}";
	public static final String NO_RESULT = "{"result":false}";
	private static ObjectMapper mapper;
	static{
		mapper = new ObjectMapper();
		//转换json时,如果对象中属性值为null,则不生成该属性
		mapper.setSerializationInclusion(Include.NON_NULL);
	}
	
	/***
	 * @param json
	 * @return 当解析失败返回null
	 * @Author: lulei 
	 * @Description: 给定json字符串获得json对象
	 */
	public static JsonNode josn2Object(String json){
		 try {
			return mapper.readTree(json);
		} catch (JsonProcessingException e) {
			// TODO Auto-generated catch block  
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			// TODO Auto-generated catch block  
			e.printStackTrace();
			return null;
		}
	}
	
	/***
	 * @param obj
	 * @return 当解析失败返回{datas:null}
	 * @Author: lulei  
	 * @Description: 给定java对象生成对应json
	 */
	public static String parseJson(Object obj){
		
		if(obj == null){
			return NO_DATA;
		}
		
		try {
			return mapper.writeValueAsString(obj);
		} catch (JsonProcessingException e) {
			// TODO Auto-generated catch block  
			e.printStackTrace();
			return NO_DATA;
		}
	}
	
	/***
	 * @param obj
	 * @param root
	 * @return 当解析失败返回{datas:null}
	 * @Author: lulei  
	 * @Description:给定java对象生成对应json,可以指定一个json的root名
	 */
	public static String parseJson(Object obj, String root){
		
		if(obj == null){
			return NO_DATA;
		}
		
		try {
			StringBuilder sb = new StringBuilder();
			sb.append("{"");
			sb.append(root);
			sb.append("":");
			sb.append(mapper.writeValueAsString(obj));
			sb.append("}");
			return sb.toString();
		} catch (JsonProcessingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return NO_DATA;
		}
	}
	
	/***
	 * @param json
	 * @param var
	 * @return 若传入var为null,则默认变量名为datas
	 * @Author: lulei  
	 * @Description:将json字符串包装成jsonp,例如var data={}方式
	 */
	public static String wrapperJsonp(String json, String var){
		if(var == null){
			var = "datas";
		}
		return new StringBuilder().append("var ").append(var).append("=").append(json).toString();
	}
	
	public static void main(String[] args) {
		HashMap<String, Integer> hash = new HashMap<String, Integer>();
		hash.put("key1", 1);
		hash.put("key2", 2);
		hash.put("key3", 3);
		System.out.println(JsonUtil.parseJson(hash));
	}
}

当然这里对第三方jar包进行再一次封装在项目中更简单的使用,上述main函数的运行结果如下(数据经过格式话处理):

至于其他方法如若感兴趣可以自行测试。
      
XML

在和前台的通信的过程中,xml数据格式也是一种常用方法,同时xml数据格式也是后台配置文件的一种形式。对xml数据的处理,有很多第三方jar包,这是使用的是dom4j,代码实现如下:

 /**  
 *@Description: Xml工具类    
 */ 
package com.lulei.util;  

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Node;

public class XmlUtil {
	private static String noResult = "<root>no result</root>";

	/**
	 * @param obj
	 * @return
	 * @Author:lulei  
	 * @Description: 将java对象转化为xml格式的字符串
	 */
	public static String parseObjToXmlString(Object obj){
		if (obj == null) {
			return noResult;
		}
		StringWriter sw = new StringWriter();
		JAXBContext jAXBContext;
		Marshaller marshaller;
		try {
			jAXBContext = JAXBContext.newInstance(obj.getClass());
			marshaller = jAXBContext.createMarshaller();
			marshaller.marshal(obj, sw);
			return sw.toString();
		} catch (JAXBException e) {
			// TODO Auto-generated catch block  
			e.printStackTrace();
		}
		return noResult;
	}
	
	/**
	 * @param xml
	 * @return
	 * @Author: lulei  
	 * @Description: 将xml String对象转化为xml对象
	 */
	public static Document createFromString(String xml){
		try {
			return DocumentHelper.parseText(xml);
		} catch (DocumentException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * @param xpath
	 * @param node
	 * @return
	 * @Author: lulei  
	 * @Description: 获取指定xpath的文本,当解析失败返回null
	 */
	public static String getTextFromNode(String xpath,Node node){
		try {
			return node.selectSingleNode(xpath).getText();
		} catch (Exception e) {
			return null;
		}
	}
	
	/**
	 * @param path
	 * @Author: lulei  
	 * @Description: 读取xml文件
	 * @return xml文件对应的Document
	 */
	public static Document createFromPath(String path){
		return createFromString(readFile(path));
	}
	
	/**
	 * @param path
	 * @Author: lulei  
	 * @Description: 读文件
	 * @return 返回文件内容字符串
	 */
	private static String readFile(String path) {
		File file = new File(path);
		FileInputStream fileInputStream;
		StringBuffer sb = new StringBuffer();
		try {
			fileInputStream = new FileInputStream(file);
			//错误使用UTF-8读取内容
			String charset = CharsetUtil.getStreamCharset(file.toURI().toURL(), "utf-8");
			InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, charset);
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
			String s;
			while ((s = bufferedReader.readLine()) != null){
				s = s.replaceAll("	", "").trim();
				if (s.length() > 0){
					sb.append(s);
				}
			}
			fileInputStream.close();
			bufferedReader.close();
			fileInputStream.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block  
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block  
			e.printStackTrace();
		} 
		return sb.toString();
	}
	
	public static void main(String[] args) {
	}
}

XmlUtil的一个使用事例如下所示:

 /**  
 *@Description: 章节列表搜索结果    
 */ 
package com.lulei.test;  

import java.util.ArrayList;

import javax.xml.bind.annotation.XmlRootElement;

import com.lulei.util.XmlUtil;
 
@XmlRootElement(name = "root")
public class TestXmlUtil {
	private int count;
	private ArrayList<String> result;
	
	public TestXmlUtil() {
		count = 3;
		result = new ArrayList<String>();
		result.add("test1");
		result.add("test2");
		result.add("test3");
	}
	
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public ArrayList<String> getResult() {
		return result;
	}
	public void setResult(ArrayList<String> result) {
		this.result = result;
	}
	
	public static void main(String[] args) {
		System.out.println(XmlUtil.parseObjToXmlString(new TestXmlUtil()));
	}
}

运行结果如下图所示(数据经过格式话处理):

在XmlUtil类中使用到了CharsetUtil类,关于CharsetUtil类在以后的博客中再详细介绍(主要作用就是检测文件或者流的编码方式等)。
      
ps:最近发现其他网站可能会对博客转载,上面并没有源链接,如想查看更多关于 基于lucene的案例开发点击这里。或访问网址http://blog.csdn.net/xiaojimanman/article/category/2841877