@@ -87,40 +87,59 @@ private Map<String, Object> jsonStringToMap(String jsonString) {
8787 return this .gson .fromJson (jsonString , type );
8888 }
8989
90- private void objectToMap (String key , Object value ) {
91- if (value == null ) {
92- this .userMap .put (key , null );
93- } else if (value instanceof Number || value instanceof Boolean || value instanceof Map || value instanceof List ) {
94- this .userMap .put (key , value );
95- } else if (value instanceof GxUserType ) {
96- this .userMap .put (key , jsonStringToMap (((GxUserType ) value ).toJSonString ()));
97- } else if (value instanceof String ) {
98- String str = (String ) value ;
99-
100- // Try to parse as JSON
90+ private Object deepConvert (Object value ) {
91+ if (value == null ) return null ;
92+
93+ if (value instanceof Number || value instanceof Boolean ) {
94+ return value ;
95+ }
96+
97+ if (value instanceof String ) {
10198 try {
102- JsonElement parsed = JsonParser .parseString (str );
99+ JsonElement parsed = JsonParser .parseString (( String ) value );
103100 if (parsed .isJsonObject ()) {
104- this .userMap .put (key , this .gson .fromJson (parsed , Map .class ));
105- } else if (parsed .isJsonArray ()) {
106- this .userMap .put (key , this .gson .fromJson (parsed , List .class ));
107- } else if (parsed .isJsonPrimitive ()) {
108- JsonPrimitive primitive = parsed .getAsJsonPrimitive ();
109- if (primitive .isBoolean ()) {
110- this .userMap .put (key , primitive .getAsBoolean ());
111- } else if (primitive .isNumber ()) {
112- this .userMap .put (key , primitive .getAsNumber ());
113- } else if (primitive .isString ()) {
114- this .userMap .put (key , primitive .getAsString ());
115- }
101+ return gson .fromJson (parsed , Map .class );
116102 }
117- } catch (JsonSyntaxException e ) {
118- // Invalid JSON: it is left as string
119- this .userMap .put (key , str );
103+ if (parsed .isJsonArray ()) {
104+ return gson .fromJson (parsed , List .class );
105+ }
106+ return ((JsonPrimitive ) parsed ).getAsString ();
107+ } catch (Exception e ) {
108+ return value ;
120109 }
121- } else {
122- // Any other object: it is converted to string
123- this .userMap .put (key , value .toString ());
124110 }
111+
112+ // SDT => Map
113+ if (value instanceof GxUserType ) {
114+ String s = ((GxUserType ) value ).toJSonString ();
115+ return jsonStringToMap (s );
116+ }
117+
118+ // Map => deep convert values
119+ if (value instanceof Map ) {
120+ Map <String ,Object > newMap = new LinkedHashMap <>();
121+ ((Map <?,?>) value ).forEach ((k ,v ) -> newMap .put (k .toString (), deepConvert (v )));
122+ return newMap ;
123+ }
124+
125+ // List => deep convert each element
126+ if (value instanceof List ) {
127+ List <Object > newList = new java .util .ArrayList <>();
128+ for (Object o : (List <?>) value ) newList .add (deepConvert (o ));
129+ return newList ;
130+ }
131+
132+ // Catch: JSONObjectWrapper
133+ if (value .getClass ().getName ().contains ("JSONObjectWrapper" ) ||
134+ value instanceof org .json .JSONObject ) {
135+ // Convert org.json to Map
136+ return jsonStringToMap (value .toString ());
137+ }
138+
139+ return value .toString ();
140+ }
141+
142+ private void objectToMap (String key , Object value ) {
143+ this .userMap .put (key , deepConvert (value ));
125144 }
126145}
0 commit comments