22
33import com .genexus .diagnostics .LogLevel ;
44import com .genexus .diagnostics .core .ILogger ;
5+ import com .genexus .json .JSONObjectWrapper ;
56import org .apache .logging .log4j .Level ;
67import org .apache .logging .log4j .LogManager ;
78import org .apache .logging .log4j .ThreadContext ;
1415import org .json .JSONArray ;
1516import org .json .JSONObject ;
1617
17- import java .util .ArrayList ;
18- import java .util .LinkedHashMap ;
19- import java .util .List ;
20- import java .util .Map ;
18+ import java .util .*;
2119
2220public class Log4J2Logger implements ILogger {
2321 private static final String STACKTRACE_KEY = "stackTrace" ;
@@ -268,7 +266,7 @@ private void writeTextFormat(String message, int logLevel, Object data, boolean
268266 mapMessage .put (STACKTRACE_KEY , getStackTraceAsList ());
269267 }
270268
271- String json = new JSONObject (mapMessage ). toString ( );
269+ String json = mapToJsonString (mapMessage );
272270 String format = "{} - {}" ;
273271 log .log (getLogLevel (logLevel ), format , message , json );
274272 }
@@ -384,16 +382,23 @@ private static boolean isJsonLogFormat() {
384382 }
385383
386384 public static Map <String , Object > jsonStringToMap (String jsonString ) {
387- JSONObject jsonObject = new JSONObject (jsonString );
385+ JSONObjectWrapper jsonObject = new JSONObjectWrapper (jsonString );
388386 return toMap (jsonObject );
389387 }
390388
391389 private static Map <String , Object > toMap (JSONObject jsonObject ) {
392390 Map <String , Object > map = new LinkedHashMap <>();
393- for (String key : jsonObject .keySet ()) {
394- Object value = jsonObject .get (key );
391+
392+ Set <Map .Entry <String , Object >> entries = (jsonObject instanceof JSONObjectWrapper )
393+ ? ((JSONObjectWrapper ) jsonObject ).entrySet ()
394+ : jsonObject .toMap ().entrySet (); // fallback for other JSONObject
395+
396+ for (Map .Entry <String , Object > entry : entries ) {
397+ String key = entry .getKey ();
398+ Object value = entry .getValue ();
395399 map .put (key , convert (value ));
396400 }
401+
397402 return map ;
398403 }
399404
@@ -417,4 +422,60 @@ private static Object convert(Object value) {
417422 return value ;
418423 }
419424 }
425+
426+ public static String mapToJsonString (Map <String , Object > map ) {
427+ StringBuilder sb = new StringBuilder ();
428+ sb .append ("{" );
429+
430+ Iterator <Map .Entry <String , Object >> iterator = map .entrySet ().iterator ();
431+ while (iterator .hasNext ()) {
432+ Map .Entry <String , Object > entry = iterator .next ();
433+
434+ sb .append ("\" " ).append (entry .getKey ()).append ("\" :" );
435+ sb .append (toJsonValue (entry .getValue ()));
436+
437+ if (iterator .hasNext ()) {
438+ sb .append ("," );
439+ }
440+ }
441+
442+ sb .append ("}" );
443+ return sb .toString ();
444+ }
445+
446+ private static String toJsonValue (Object value ) {
447+ if (value == null || value == JSONObject .NULL ) {
448+ return "null" ;
449+ } else if (value instanceof String ) {
450+ return "\" " + value + "\" " ;
451+ } else if (value instanceof Number || value instanceof Boolean ) {
452+ return value .toString ();
453+ } else if (value instanceof JSONObject ) {
454+ return mapToJsonString (((JSONObject ) value ).toMap ());
455+ } else if (value instanceof Map ) {
456+ return mapToJsonString ((Map <String , Object >) value );
457+ } else if (value instanceof JSONArray ) {
458+ return listToJsonString (((JSONArray ) value ).toList ());
459+ } else if (value instanceof Collection ) {
460+ return listToJsonString ((Collection <?>) value );
461+ } else {
462+ return "\" " + value .toString () + "\" " ; // fallback: string
463+ }
464+ }
465+
466+ private static String listToJsonString (Collection <?> list ) {
467+ StringBuilder sb = new StringBuilder ();
468+ sb .append ("[" );
469+
470+ Iterator <?> it = list .iterator ();
471+ while (it .hasNext ()) {
472+ sb .append (toJsonValue (it .next ()));
473+ if (it .hasNext ()) {
474+ sb .append ("," );
475+ }
476+ }
477+
478+ sb .append ("]" );
479+ return sb .toString ();
480+ }
420481}
0 commit comments