/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.atlas.json;
import java.io.* ;
import org.apache.jena.atlas.io.IO ;
import org.apache.jena.atlas.io.IndentedLineBuffer ;
import org.apache.jena.atlas.io.IndentedWriter ;
import org.apache.jena.atlas.json.io.JSONMaker ;
import org.apache.jena.atlas.json.io.JsonWriter ;
import org.apache.jena.atlas.json.io.parser.JSONParser ;
import org.apache.jena.atlas.json.io.parserjavacc.JSONParserJavaCC ;
/** A class that is the front door to the JSON subsystem */
public class JSON
{
/** Parse a complete JSON object */
public static JsonObject parse(InputStream input) {
JSONMaker maker = new JSONMaker() ;
_parse(input, maker) ;
return (JsonObject)maker.jsonValue() ;
}
/** Parse a complete JSON object */
public static JsonObject parse(String string) {
return _parse(new StringReader(string)) ;
}
/** Parse any JSON value, not just an object, from an input stream */
public static JsonValue parseAny(InputStream input) {
JSONMaker maker = new JSONMaker() ;
_parseAny(input, maker) ;
return maker.jsonValue() ;
}
/** Parse any JSON value, not just an object, from a file */
public static JsonValue parseAny(String string) {
return _parseAny(new StringReader(string)) ;
}
/** Read a JSON object from a file */
public static JsonObject read(String filename) {
try (InputStream in = IO.openFileEx(filename)) {
return JSON.parse(in) ;
}
catch (FileNotFoundException ex) {
IO.exception("File not found: " + filename, ex) ;
return null ;
}
catch (IOException ex) {
IO.exception("IOException: " + filename, ex) ;
return null ;
}
}
/** Read any JSON value, not just an object, from a file */
public static JsonValue readAny(String filename) {
try {
try (InputStream in = IO.openFileEx(filename)) {
return JSON.parseAny(in) ;
}
}
catch (FileNotFoundException ex) {
throw new RuntimeException("File not found: " + filename, ex) ;
}
catch (IOException ex) {
IO.exception("IOException: " + filename, ex) ;
return null ;
}
}
// Hide the reader versions - not encouraged due to charset problems.
private static JsonObject _parse(Reader r) {
JSONMaker maker = new JSONMaker() ;
_parse(r, maker) ;
return (JsonObject)maker.jsonValue() ;
}
private static JsonValue _parseAny(Reader r) {
JSONMaker maker = new JSONMaker() ;
_parseAny(r, maker) ;
return maker.jsonValue() ;
}
// PARSER CHOICES
// Switch on parser choice.
private static final boolean useJavaCC = false ;
private static void _parse(Reader r, JSONMaker maker) {
if ( useJavaCC )
JSONParserJavaCC.parse(r, maker) ;
else
JSONParser.parse(r, maker) ;
}
private static void _parseAny(Reader r, JSONMaker maker) {
if ( useJavaCC )
JSONParserJavaCC.parseAny(r, maker) ;
else
JSONParser.parseAny(r, maker) ;
}
private static void _parse(InputStream r, JSONMaker maker) {
if ( useJavaCC )
JSONParserJavaCC.parse(r, maker) ;
else
JSONParser.parse(r, maker) ;
}
private static void _parseAny(InputStream r, JSONMaker maker) {
if ( useJavaCC )
JSONParserJavaCC.parseAny(r, maker) ;
else
JSONParser.parseAny(r, maker) ;
}
/** JsonValue to a formatted, multiline string */
public static String toString(JsonValue jValue) {
try ( IndentedLineBuffer b = new IndentedLineBuffer() ) {
JSON.write(b, jValue);
return b.asString() ;
}
}
/** JsonValue to a string with no newlines */
public static String toStringFlat(JsonValue jValue) {
try ( IndentedLineBuffer b = new IndentedLineBuffer() ) {
b.setFlatMode(true);
JSON.write(b, jValue);
return b.asString() ;
}
}
/** Write out a JSON value - pass a JSON Object to get legal exchangeable JSON */
public static void write(OutputStream output, JsonValue jValue) {
IndentedWriter iOut = new IndentedWriter(output) ;
write(iOut, jValue) ;
iOut.flush() ;
}
/** Write out a JSON value - pass a JSON Object to get legal exchangeable JSON */
public static void write(IndentedWriter output, JsonValue jValue) {
JsonWriter w = new JsonWriter(output) ;
w.startOutput() ;
jValue.visit(w) ;
w.finishOutput() ;
}
/** Write out a JSON value to - pass a JSON Object to get legal exchangeable JSON */
public static void write(JsonValue jValue) {
write(IndentedWriter.stdout, jValue) ;
}
}