From d6cde7e7ce25c9b5134a1314d9fe28b1625f1a3f Mon Sep 17 00:00:00 2001 From: fpanizza Date: Fri, 28 Mar 2025 12:31:25 -0300 Subject: [PATCH] fix JsonObjectWrapper to load internal map on constructor if has items in Android. --- .../android/AndroidJSONSerialization.java | 12 ++++++++++++ .../IExtensionJSONSerialization.java | 1 + .../com/genexus/json/JSONObjectWrapper.java | 19 +++++++++++++------ 3 files changed, 26 insertions(+), 6 deletions(-) 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 f9622d2cf..5af32f0cc 100644 --- a/android/src/main/java/com/genexus/specific/android/AndroidJSONSerialization.java +++ b/android/src/main/java/com/genexus/specific/android/AndroidJSONSerialization.java @@ -9,6 +9,7 @@ import java.util.Map; public class AndroidJSONSerialization implements IExtensionJSONSerialization { + @Override public Iterator> getJSONObjectIterator(JSONObjectWrapper obj) { Map map = new LinkedHashMap<>(); @@ -24,4 +25,15 @@ public Iterator> getJSONObjectIterator(JSONObjectWrapp public JSONTokener getJSONTokener(String s) { return new AndroidJSONTokenerWrapper(s); } + + @Override + public Map getJSONObjectMap(JSONObjectWrapper obj) { + Map map = new LinkedHashMap<>(); + for (Iterator it = obj.keys(); it.hasNext(); ) { + String k = it.next(); + map.put(k, obj.get(k)); // add key and value to map result + } + return map; + + } } 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 5051ab237..3e8bb7833 100644 --- a/common/src/main/java/com/genexus/common/interfaces/IExtensionJSONSerialization.java +++ b/common/src/main/java/com/genexus/common/interfaces/IExtensionJSONSerialization.java @@ -9,4 +9,5 @@ public interface IExtensionJSONSerialization { Iterator> getJSONObjectIterator(JSONObjectWrapper obj); JSONTokener getJSONTokener(String s); + public Map getJSONObjectMap(JSONObjectWrapper obj); } diff --git a/common/src/main/java/com/genexus/json/JSONObjectWrapper.java b/common/src/main/java/com/genexus/json/JSONObjectWrapper.java index 869cdfc29..d17b9fa6f 100644 --- a/common/src/main/java/com/genexus/json/JSONObjectWrapper.java +++ b/common/src/main/java/com/genexus/json/JSONObjectWrapper.java @@ -22,15 +22,12 @@ public JSONObjectWrapper(String string) { ? SpecificImplementation.JsonSerialization.getJSONTokener(string) : new JSONTokenerWrapper(string) ); - - if (map == null) - map = new LinkedHashMap(); + initMap(); } public JSONObjectWrapper(JSONTokenerWrapper token) { super(token); - if (map == null) - map = new LinkedHashMap(); + initMap(); } public JSONObjectWrapper(Map m) { @@ -48,8 +45,18 @@ public JSONObjectWrapper(Map m) { public JSONObjectWrapper(JSONObject jsonObject) { super(jsonObject.toString()); + initMap(); + } + + private void initMap() { if (map == null) - map = new LinkedHashMap(); + { + // this is a workaround for the Android implementation not loading the map in the JsonObject constructor + if (SpecificImplementation.JsonSerialization != null) + map = SpecificImplementation.JsonSerialization.getJSONObjectMap(this); + else + map = new LinkedHashMap(); + } } public Set> entrySet() {