JsonUtil & XmlUtil

最后更新于:2022-04-01 19:48:25

转载请注明出处:[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 hash = new HashMap(); hash.put("key1", 1); hash.put("key2", 2); hash.put("key3", 3); System.out.println(JsonUtil.parseJson(hash)); } } ~~~ 当然这里对第三方jar包进行再一次封装在项目中更简单的使用,上述main函数的运行结果如下(数据经过格式话处理): ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56ca7bef1ca97.jpg) 至于其他方法如若感兴趣可以自行测试。        **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 = "no result"; /** * @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 result; public TestXmlUtil() { count = 3; result = new ArrayList(); result.add("test1"); result.add("test2"); result.add("test3"); } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public ArrayList getResult() { return result; } public void setResult(ArrayList result) { this.result = result; } public static void main(String[] args) { System.out.println(XmlUtil.parseObjToXmlString(new TestXmlUtil())); } } ~~~ 运行结果如下图所示(数据经过格式话处理): ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-22_56ca7bef2a5ad.jpg) 在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
';