基于lucene的案例开发:JsonUtil & XmlUtil

转载请注明出处: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("\t", "").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

时间: 2024-10-10 19:49:52

基于lucene的案例开发:JsonUtil & XmlUtil的相关文章

基于lucene的案例开发:ParseUtil &amp; ParseRequest

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43195045 这篇博客主要介绍ParseUtil类和ParseRequest类,因为这两个类都比较简单,所以这里就不会给出事例程序. ParseUtil ParseUtil类主要实现将字符串(数字)转化为数值,这个在读取配置文件或数据转化过程中有很大的作用.源程序如下: /** *@Description: 转换类 */ package com.lulei.util; publ

基于lucene的案例开发:ClassUtil &amp; CharsetUtil

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43194793 这篇博客主要介绍ClassUtil类和CharsetUtil类.这两个也是项目中比较常用的类,一个用于指定文件路径,一个用于检测文件的编码方式. ClassUtil ClassUtil类中的方法主要是返回class文件所在的文件目录或工程的根目录地址,这主要用于指定工程中配置文件的路径,不至于环境迁移而导致配置文件路径错误.源代码如下: /** * @Descri

基于lucene的案例开发:实时索引的检索

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44279753 http://www.llwjy.com/blogdetail/31bb705106379feaf6d31b58dd777be6.html 个人博客小站搭建成功,网址 www.llwjy.com,欢迎大家来吐槽~ 在前面的博客中,我们已经介绍了IndexSearcher中的检索方法,也介绍了如何基于lucene中的NRT*类去创建实时索引,在这篇博客中我们就重点介

基于lucene的案例开发:实时索引的修改

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44280311 http://www.llwjy.com/blogdetail/e42fa5c3097f4964fca0fdfe7cd7a9a2.html 个人的博客小站已经上线了,网址 www.llwjy.com,欢迎大家来吐槽~ 上一篇博客已经介绍了实时索引的检索功能,这个就相当于数据的的查询功能,我们都知道数据库的增删改查是最常用的四个功能,实时索引也是一样,他也有增删改查

基于lucene的案例开发:纵横小说分布式采集

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/46812645 http://www.llwjy.com/blogdetail/9df464b20cca5405c7ce07e2fb2d768f.html 个人博客站已经上线了,网址 www.llwjy.com ~欢迎各位吐槽~ ----------------------------------------------------------------------------

基于lucene的案例开发:数据库连接池

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43272993 通过java程序去连接数据库时,使用的协议是TCP/IP协议,TCP/IP协议需要进行3次握手.如果每一次数据库操作都需要创建一个新的连接,都要进行3次握手,这是十分浪费资源的,程序的效率也不是很高.为了解决这个问题,我们想可不可以自己维护一些数据库连接,需要数据库操作的时候,直接使用这其中的一个连接,用完了,在还给它,这样的话就不需要每次数据库操作都创建一个新的

基于lucene的案例开发:案例初识

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/43192055 首先抱歉,这几天在准备案例的整体框架设计,所以更新就断了几天,还请原谅. 案例整体介绍 在我们开始正式的案例开发介绍之前,我们先看一下整体的案例demo介绍,明白案例是做什么的. 从上图中,我们可以看出,这个案例主要是通过爬虫程序去采集纵横小说上的资源,然后将资源存储到自己的数据库中,将数据库中的需要检索的数据通过lucene建立索引文件,最后通过web服务展示数

基于lucene的案例开发:查询语句创建PackQuery

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44656141 http://www.llwjy.com/blogdetail/162e5e70516d7ddfb6df8f77e6b13a2b.html 个人博客站已经上线了,网址 www.llwjy.com~欢迎各位吐槽 ------------------------------------------------------------------------------

基于lucene的案例开发:纵横小说阅读页采集

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44937073 http://www.llwjy.com/blogdetail/29bd8de30e8d17871c707b76ec3212b0.html 个人博客站已经上线了,网址 www.llwjy.com ~欢迎各位吐槽~ ----------------------------------------------------------------------------