本文出自:http://www.iteye.com/topic/402083
下面是一个将XML转换为JSON的示例,
通过SAX来解析XML,从而生成相应的JSON字符串
自我感觉还算是一个比较通用的API ,主要包含3个类
1,ToJsonSAXHandler
类 继承了 DefaultHandler 类,在解析
XML的过程中负责处理SAX事件。代码如下:
- packageorg.yjf.xmlToJson;
- importorg.xml.sax.Attributes;
- importorg.xml.sax.SAXException;
- importorg.xml.sax.helpers.DefaultHandler;
- publicclassToJsonSAXHandlerextendsDefaultHandler{
- privateStringBuilderjsonStringBuilder;
- privatebooleanisProcessing;
- privatebooleanjustProcessStartElement;
- publicToJsonSAXHandler(){
- jsonStringBuilder=newStringBuilder();
- }
- @Override
- publicvoidstartDocument()throwsSAXException{
- isProcessing=true;
- justProcessStartElement=true;
- this.jsonStringBuilder.delete(0,this.jsonStringBuilder.length());
- }
- @Override
- publicvoidendDocument()throwsSAXException{
- isProcessing=false;
- }
- @Override
- publicvoidstartElement(Stringuri,StringlocalName,StringqName,
- Attributesattrs)throwsSAXException{
- if(!justProcessStartElement){
- jsonStringBuilder.append(',');
- justProcessStartElement=true;
- }
- jsonStringBuilder.append("{");
- jsonStringBuilder.append("localName:").append('\"').append(localName).append('\"').append(',');
- jsonStringBuilder.append("uri:").append('\"').append(uri).append('\"').append(',');
- jsonStringBuilder.append("qName:").append('\"').append(qName).append('\"').append(',');
- jsonStringBuilder.append("attrs:{");
- if(attrs.getLength()>0){
- jsonStringBuilder.append(attrs.getLocalName(0)).append(":")
- .append(attrs.getValue(0));
- for(inti=1;i<attrs.getLength();i++){
- jsonStringBuilder.append(',').append(attrs.getLocalName(i)).append(":")
- .append(attrs.getValue(i));
- }
- }
- jsonStringBuilder.append("},");
- jsonStringBuilder.append("childElements:[").append('\n');
- }
- @Override
- publicvoidendElement(Stringuri,StringlocalName,StringqName)
- throwsSAXException{
- justProcessStartElement=false;
- jsonStringBuilder.append("]}").append('\n');
- }
- @Override
- publicvoidcharacters(char[]ch,intbegin,intlength)
- throwsSAXException{
- if(!justProcessStartElement){
- jsonStringBuilder.append(',');
- }else
- justProcessStartElement=false;
- jsonStringBuilder.append('\"');
- for(inti=begin;i<begin+length;i++){
- switch(ch[i]){
- case'\'':jsonStringBuilder.append("\\'");break;
- case'\"':jsonStringBuilder.append("\\\"");break;
- case'\n':jsonStringBuilder.append("\\n");break;
- case'\t':jsonStringBuilder.append("\\t");break;
- case'\r':jsonStringBuilder.append("\\r");break;
- default:jsonStringBuilder.append(ch[i]);break;
- }
- }
- jsonStringBuilder.append('\"').append('\n');
- }
- publicStringgetJsonString()throwsXMLToJSONException{
- if(this.isProcessing)
- thrownewXMLToJSONException("getJsonStringbeforeresolutionisfinished");
- else
- returnjsonStringBuilder.toString();
- }
- }
2,XMLToJSONException
是一个异常类(封装在转换过程中可能产生的异常),代码如下:
- packageorg.yjf.xmlToJson;
- publicclassXMLToJSONExceptionextendsException{
- privatestaticfinallongserialVersionUID=1L;
- publicXMLToJSONException(){}
- publicXMLToJSONException(Stringmessage){
- super(message);
- }
- }
3,XMLToJSON类 是一个将XML转换为JSON字符串的工具类
- packageorg.yjf.xmlToJson;
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.IOException;
- importjava.io.StringReader;
- importorg.xml.sax.InputSource;
- importorg.xml.sax.SAXException;
- importorg.xml.sax.XMLReader;
- importorg.xml.sax.helpers.XMLReaderFactory;
- publicclassXMLToJSON{
- publicstaticStringconvert(StringxmlStr)throwsSAXException,
- IOException,XMLToJSONException{
- returnconvert(newInputSource(newStringReader(xmlStr)));
- }
- publicstaticStringconvert(Filefile)throwsSAXException,
- IOException,XMLToJSONException{
- returnconvert(newInputSource(newFileInputStream(file)));
- }
- publicstaticStringconvert(InputSourceinputSource)throwsSAXException,
- IOException,XMLToJSONException{
- ToJsonSAXHandlerhandler=newToJsonSAXHandler();
- XMLReaderreader=XMLReaderFactory.createXMLReader();
- reader.setContentHandler(handler);
- reader.setErrorHandler(handler);
- reader.parse(inputSource);
- returnhandler.getJsonString();
- }
- }
测试类 Test 如下 (因为生成的JSON不包含缩进,所以看起来可能不太直观,所以我用了JSONObject类来打印带有缩进的JSON字符串,同时也验证了转换出来的JSON字符串是一个有效的JSON字符串):
- packagetest;
- importjava.io.File;
- importjava.io.IOException;
- importorg.json.JSONException;
- importorg.json.JSONObject;
- importorg.xml.sax.SAXException;
- importorg.yjf.xmlToJson.XMLToJSON;
- importorg.yjf.xmlToJson.XMLToJSONException;
- publicclassTest_1{
- publicstaticvoidmain(String[]args)throwsJSONException,
- SAXException,IOException,XMLToJSONException{
- StringjsonStr=XMLToJSON.convert(newFile("books.xml"));
- JSONObjectjsonObj=newJSONObject(jsonStr);
- System.out.println(jsonObj.toString(2));
- }
- }
books.xml 的内容如下:
- <?xmlversion="1.0"encoding="utf-8"?>
- <bookscount="2"xmlns="http://test.org/books">
- <bookid="1"page="1000">
- <name>ThinkinginJAVA</name>
- </book>
- <bookid="2"page="800">
- <name>CoreJAVA2</name>
- </book>
- </books>
运行 Test 类输出的JSON字符串如下:
{
"attrs": {"count": 2},
"childElements": [
"\n\t",
{
"attrs": {
"id": 1,
"page": 1000
},
"childElements": [
"\n\t\t",
{
"attrs": {},
"childElements": ["Thinking in JAVA"],
"localName": "name",
"qName": "name",
"uri": "http://test.org/books"
},
"\n\t"
],
"localName": "book",
"qName": "book",
"uri": "http://test.org/books"
},
"\n\t",
{
"attrs": {
"id": 2,
"page": 800
},
"childElements": [
"\n\t\t",
{
"attrs": {},
"childElements": ["Core JAVA2"],
"localName": "name",
"qName": "name",
"uri": "http://test.org/books"
},
"\n\t"
],
"localName": "book",
"qName": "book",
"uri": "http://test.org/books"
},
"\n"
],
"localName": "books",
"qName": "books",
"uri": "http://test.org/books"
}