轉載請注明出處:[http://blog.csdn.net/xiaojimanman/article/details/43194015](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) 請[點擊這里](http://blog.csdn.net/xiaojimanman/article/category/2841877)。或訪問網址http://blog.csdn.net/xiaojimanman/article/category/2841877
- 前言
- 寫在開始之前
- lucene初始認知
- 索引數學模型
- 索引文件結構
- 創建索引
- 搜索索引
- 分詞器介紹
- Query查詢
- IndexSearcher中檢索方法
- 更新說明
- 案例初識
- JsonUtil &amp; XmlUtil
- 基ClassUtil &amp; CharsetUtil
- ParseUtil &amp; ParseRequest
- 數據庫連接池
- 實現實時索引基本原理
- 實時索引管理類IndexManager
- 實時索引的檢索
- 實時索引的修改
- 查詢語句創建PackQuery
- 縱橫小說更新列表頁抓取
- 縱橫小說簡介頁采集
- 縱橫小說章節列表采集
- 縱橫小說閱讀頁采集
- 縱橫小說數據庫設計
- 縱橫小說數據庫操作
- 縱橫小說分布式采集