diff --git a/android/src/main/java/com/genexus/specific/android/AndroidJSONSerialization.java b/android/src/main/java/com/genexus/specific/android/AndroidJSONSerialization.java index d8e43c17d..f9622d2cf 100644 --- a/android/src/main/java/com/genexus/specific/android/AndroidJSONSerialization.java +++ b/android/src/main/java/com/genexus/specific/android/AndroidJSONSerialization.java @@ -2,6 +2,7 @@ import com.genexus.common.interfaces.IExtensionJSONSerialization; import com.genexus.json.JSONObjectWrapper; +import org.json.JSONTokener; import java.util.Iterator; import java.util.LinkedHashMap; @@ -18,4 +19,9 @@ public Iterator> getJSONObjectIterator(JSONObjectWrapp return map.entrySet().iterator(); } + + @Override + public JSONTokener getJSONTokener(String s) { + return new AndroidJSONTokenerWrapper(s); + } } diff --git a/android/src/main/java/com/genexus/specific/android/AndroidJSONTokenerWrapper.java b/android/src/main/java/com/genexus/specific/android/AndroidJSONTokenerWrapper.java new file mode 100644 index 000000000..777776bf3 --- /dev/null +++ b/android/src/main/java/com/genexus/specific/android/AndroidJSONTokenerWrapper.java @@ -0,0 +1,27 @@ +package com.genexus.specific.android; + +import org.json.JSONException; +import org.json.JSONObject; +import org.json.JSONTokener; + +import com.genexus.json.JSONObjectWrapper; + +public class AndroidJSONTokenerWrapper extends JSONTokener { + public AndroidJSONTokenerWrapper(String string) { + super(string); + } + + public Object nextValue() throws JSONException { + char c = this.nextClean(); + this.back(); + if (c == '{') { + try { + return new JSONObjectWrapper((JSONObject) super.nextValue()); + } catch (StackOverflowError e) { + throw new JSONException("JSON Array or Object depth too large to process.", e); + } + } + else + return super.nextValue(); + } +} diff --git a/common/src/main/java/com/genexus/common/interfaces/IExtensionJSONSerialization.java b/common/src/main/java/com/genexus/common/interfaces/IExtensionJSONSerialization.java index 060f64d62..5051ab237 100644 --- a/common/src/main/java/com/genexus/common/interfaces/IExtensionJSONSerialization.java +++ b/common/src/main/java/com/genexus/common/interfaces/IExtensionJSONSerialization.java @@ -1,10 +1,12 @@ package com.genexus.common.interfaces; import com.genexus.json.JSONObjectWrapper; +import org.json.JSONTokener; import java.util.Iterator; import java.util.Map; public interface IExtensionJSONSerialization { Iterator> getJSONObjectIterator(JSONObjectWrapper obj); + JSONTokener getJSONTokener(String s); } diff --git a/common/src/main/java/com/genexus/json/JSONObjectWrapper.java b/common/src/main/java/com/genexus/json/JSONObjectWrapper.java index de3677b7e..869cdfc29 100644 --- a/common/src/main/java/com/genexus/json/JSONObjectWrapper.java +++ b/common/src/main/java/com/genexus/json/JSONObjectWrapper.java @@ -3,8 +3,11 @@ import java.util.*; import java.util.Map.Entry; + +import com.genexus.common.interfaces.SpecificImplementation; import org.json.JSONException; import org.json.JSONObject; + public class JSONObjectWrapper extends JSONObject implements java.io.Serializable{ private Map map; @@ -15,7 +18,11 @@ public JSONObjectWrapper() { } public JSONObjectWrapper(String string) { - super(new JSONTokenerWrapper(string)); + super(SpecificImplementation.JsonSerialization != null + ? SpecificImplementation.JsonSerialization.getJSONTokener(string) + : new JSONTokenerWrapper(string) + ); + if (map == null) map = new LinkedHashMap(); } diff --git a/common/src/main/java/com/genexus/json/JSONTokenerWrapper.java b/common/src/main/java/com/genexus/json/JSONTokenerWrapper.java index ade1f07ed..6094ee009 100644 --- a/common/src/main/java/com/genexus/json/JSONTokenerWrapper.java +++ b/common/src/main/java/com/genexus/json/JSONTokenerWrapper.java @@ -1,6 +1,5 @@ package com.genexus.json; -import org.json.JSONObject; import org.json.JSONTokener; import org.json.JSONException; @@ -15,7 +14,7 @@ public Object nextValue() throws JSONException { this.back(); if (c == '{') { try { - return new JSONObjectWrapper((JSONObject) super.nextValue()); + return new JSONObjectWrapper(this); } catch (StackOverflowError e) { throw new JSONException("JSON Array or Object depth too large to process.", e); }