diff --git a/src/main/java/org/json/JSONArray.java b/src/main/java/org/json/JSONArray.java index 6458ab254..bdad42753 100644 --- a/src/main/java/org/json/JSONArray.java +++ b/src/main/java/org/json/JSONArray.java @@ -67,12 +67,6 @@ public class JSONArray implements Iterable { */ private final ArrayList myArrayList; - // strict mode checks after constructor require access to this object - private JSONTokener jsonTokener; - - // strict mode checks after constructor require access to this object - private JSONParserConfiguration jsonParserConfiguration; - /** * Construct an empty JSONArray. */ @@ -102,14 +96,7 @@ public JSONArray(JSONTokener x) throws JSONException { public JSONArray(JSONTokener x, JSONParserConfiguration jsonParserConfiguration) throws JSONException { this(); - if (this.jsonParserConfiguration == null) { - this.jsonParserConfiguration = jsonParserConfiguration; - } - if (this.jsonTokener == null) { - this.jsonTokener = x; - this.jsonTokener.setJsonParserConfiguration(this.jsonParserConfiguration); - } - + boolean isInitial = x.getPrevious() == 0; if (x.nextClean() != '[') { throw x.syntaxError("A JSONArray text must start with '['"); } @@ -156,11 +143,19 @@ public JSONArray(JSONTokener x, JSONParserConfiguration jsonParserConfiguration) x.back(); break; case ']': + if (isInitial && jsonParserConfiguration.isStrictMode() && + x.nextClean() != 0) { + throw x.syntaxError("Strict mode error: Unparsed characters found at end of input text"); + } return; default: throw x.syntaxError("Expected a ',' or ']'"); } } + } else { + if (isInitial && jsonParserConfiguration.isStrictMode() && x.nextClean() != 0) { + throw x.syntaxError("Strict mode error: Unparsed characters found at end of input text"); + } } } @@ -176,11 +171,6 @@ public JSONArray(JSONTokener x, JSONParserConfiguration jsonParserConfiguration) */ public JSONArray(String source) throws JSONException { this(source, new JSONParserConfiguration()); - // Strict mode does not allow trailing chars - if (this.jsonParserConfiguration.isStrictMode() && - this.jsonTokener.nextClean() != 0) { - throw jsonTokener.syntaxError("Strict mode error: Unparsed characters found at end of input text"); - } } /** @@ -195,12 +185,7 @@ public JSONArray(String source) throws JSONException { * If there is a syntax error. */ public JSONArray(String source, JSONParserConfiguration jsonParserConfiguration) throws JSONException { - this(new JSONTokener(source), jsonParserConfiguration); - // Strict mode does not allow trailing chars - if (this.jsonParserConfiguration.isStrictMode() && - this.jsonTokener.nextClean() != 0) { - throw jsonTokener.syntaxError("Strict mode error: Unparsed characters found at end of input text"); - } + this(new JSONTokener(source, jsonParserConfiguration), jsonParserConfiguration); } /** diff --git a/src/main/java/org/json/JSONObject.java b/src/main/java/org/json/JSONObject.java index 3bb6da7ed..7ec1b2cc6 100644 --- a/src/main/java/org/json/JSONObject.java +++ b/src/main/java/org/json/JSONObject.java @@ -152,12 +152,6 @@ public Class getMapType() { */ public static final Object NULL = new Null(); - // strict mode checks after constructor require access to this object - private JSONTokener jsonTokener; - - // strict mode checks after constructor require access to this object - private JSONParserConfiguration jsonParserConfiguration; - /** * Construct an empty JSONObject. */ @@ -217,18 +211,11 @@ public JSONObject(JSONTokener x) throws JSONException { */ public JSONObject(JSONTokener x, JSONParserConfiguration jsonParserConfiguration) throws JSONException { this(); - - if (this.jsonParserConfiguration == null) { - this.jsonParserConfiguration = jsonParserConfiguration; - } - if (this.jsonTokener == null) { - this.jsonTokener = x; - this.jsonTokener.setJsonParserConfiguration(this.jsonParserConfiguration); - } - char c; String key; + boolean isInitial = x.getPrevious() == 0; + if (x.nextClean() != '{') { throw x.syntaxError("A JSONObject text must begin with '{'"); } @@ -238,6 +225,9 @@ public JSONObject(JSONTokener x, JSONParserConfiguration jsonParserConfiguration case 0: throw x.syntaxError("A JSONObject text must end with '}'"); case '}': + if (isInitial && jsonParserConfiguration.isStrictMode() && x.nextClean() != 0) { + throw x.syntaxError("Strict mode error: Unparsed characters found at end of input text"); + } return; default: key = x.nextSimpleValue(c).toString(); @@ -288,6 +278,9 @@ public JSONObject(JSONTokener x, JSONParserConfiguration jsonParserConfiguration x.back(); break; case '}': + if (isInitial && jsonParserConfiguration.isStrictMode() && x.nextClean() != 0) { + throw x.syntaxError("Strict mode error: Unparsed characters found at end of input text"); + } return; default: throw x.syntaxError("Expected a ',' or '}'"); @@ -456,11 +449,6 @@ public JSONObject(Object object, String ... names) { */ public JSONObject(String source) throws JSONException { this(source, new JSONParserConfiguration()); - // Strict mode does not allow trailing chars - if (this.jsonParserConfiguration.isStrictMode() && - this.jsonTokener.nextClean() != 0) { - throw new JSONException("Strict mode error: Unparsed characters found at end of input text"); - } } /** @@ -478,12 +466,7 @@ public JSONObject(String source) throws JSONException { * duplicated key. */ public JSONObject(String source, JSONParserConfiguration jsonParserConfiguration) throws JSONException { - this(new JSONTokener(source), jsonParserConfiguration); - // Strict mode does not allow trailing chars - if (this.jsonParserConfiguration.isStrictMode() && - this.jsonTokener.nextClean() != 0) { - throw new JSONException("Strict mode error: Unparsed characters found at end of input text"); - } + this(new JSONTokener(source, jsonParserConfiguration), jsonParserConfiguration); } /** @@ -1280,7 +1263,7 @@ public BigDecimal optBigDecimal(String key, BigDecimal defaultValue) { static BigDecimal objectToBigDecimal(Object val, BigDecimal defaultValue) { return objectToBigDecimal(val, defaultValue, true); } - + /** * @param val value to convert * @param defaultValue default value to return is the conversion doesn't work or is null. diff --git a/src/main/java/org/json/JSONTokener.java b/src/main/java/org/json/JSONTokener.java index d4c780e86..b6aee1110 100644 --- a/src/main/java/org/json/JSONTokener.java +++ b/src/main/java/org/json/JSONTokener.java @@ -40,7 +40,8 @@ public class JSONTokener { * * @param reader A reader. */ - public JSONTokener(Reader reader) { + public JSONTokener(Reader reader, JSONParserConfiguration jsonParserConfiguration) { + this.jsonParserConfiguration = jsonParserConfiguration; this.reader = reader.markSupported() ? reader : new BufferedReader(reader); @@ -53,13 +54,24 @@ public JSONTokener(Reader reader) { this.line = 1; } + public JSONTokener(Reader reader) { + this(reader, new JSONParserConfiguration()); + } /** * Construct a JSONTokener from an InputStream. The caller must close the input stream. * @param inputStream The source. */ public JSONTokener(InputStream inputStream) { - this(new InputStreamReader(inputStream, Charset.forName("UTF-8"))); + this(inputStream, new JSONParserConfiguration()); + } + + /** + * Construct a JSONTokener from an InputStream. The caller must close the input stream. + * @param inputStream The source. + */ + public JSONTokener(InputStream inputStream, JSONParserConfiguration jsonParserConfiguration) { + this(new InputStreamReader(inputStream, Charset.forName("UTF-8")),jsonParserConfiguration); } @@ -72,6 +84,10 @@ public JSONTokener(String s) { this(new StringReader(s)); } + public JSONTokener(String s, JSONParserConfiguration jsonParserConfiguration) { + this(new StringReader(s), jsonParserConfiguration); + } + /** * Getter * @return jsonParserConfiguration