java/alt2xml-in-json/src/cz/frantovo/alt2xml/in/json/JsonSimpleContentHandler.java
3 * Copyright © 2014 František Kučera (frantovo.cz)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 package cz.frantovo.alt2xml.in.json;
20 import java.io.IOException;
21 import java.util.Stack;
22 import org.json.simple.parser.ParseException;
23 import org.xml.sax.ContentHandler;
24 import org.xml.sax.SAXException;
28 * @author Ing. František Kučera (frantovo.cz)
30 public class JsonSimpleContentHandler implements org.json.simple.parser.ContentHandler {
32 /** Sem vypisujeme XML události */
33 private final ContentHandler saxVýstup;
34 /** Musíme si pamatovat polohu v XML stromu, abychom věděli, kterou značku kdy uzavřít */
35 private final Stack<String> poloha = new Stack<>();
37 * Po textových uzlech vkládáme konce elementů rovnou,
38 * ale pokud jeden element končí hned po jiném,
39 * vložíme mezi ně ještě konec řádku a odsazení.
41 private boolean zalomitŘádek = false;
43 public JsonSimpleContentHandler(ContentHandler saxVýstup) {
44 this.saxVýstup = saxVýstup;
47 private void začniElement(String název) throws IOException {
50 saxVýstup.startElement(null, null, název, null);
52 } catch (SAXException e) {
53 throw new IOException("Chyba při začátku elementu.", e);
57 private void ukončiElement() throws IOException {
59 String značka = poloha.pop();
64 saxVýstup.endElement(null, null, značka);
65 } catch (SAXException e) {
66 throw new IOException("Chyba při ukončování elementu.", e);
70 private void vložOdsazení() throws IOException {
72 * TODO: ignorableWhitespace() ?
75 for (int i = 0; i < poloha.size(); i++) {
80 private void vložText(String text) throws IOException {
82 saxVýstup.characters(text.toCharArray(), 0, text.length());
83 } catch (SAXException e) {
84 throw new IOException("Chyba při vkládání textu.", e);
89 public void startJSON() throws ParseException, IOException {
91 saxVýstup.startDocument();
92 začniElement("objekt");
93 } catch (SAXException e) {
94 throw new IOException("Chyba při začátku dokumentu.", e);
99 public void endJSON() throws ParseException, IOException {
103 saxVýstup.endDocument();
104 } catch (SAXException e) {
105 throw new IOException(e);
110 public boolean startObject() throws ParseException, IOException {
112 * TODO: zachovat hranice mezi objekty, které jsou prvkem pole
114 * { "type": "home", "number": "212 555-1234" },
115 * { "type": "fax", "number": "646 555-4567" }
120 // System.err.println("startObject");
125 public boolean endObject() throws ParseException, IOException {
126 // System.err.println("endObject");
131 public boolean startObjectEntry(String key) throws ParseException, IOException {
137 public boolean endObjectEntry() throws ParseException, IOException {
139 // System.err.println("endObjectEntry");
144 public boolean startArray() throws ParseException, IOException {
145 // System.err.println("startArray");
150 public boolean endArray() throws ParseException, IOException {
151 // System.err.println("endArray");
156 public boolean primitive(Object value) throws ParseException, IOException {
157 vložText(String.valueOf(value));
158 zalomitŘádek = false;