Skip to content

Commit 15dcce7

Browse files
committed
Maintain insertion order when logging JSONs
1 parent c26b06e commit 15dcce7

File tree

1 file changed

+69
-8
lines changed

1 file changed

+69
-8
lines changed

wrappercommon/src/main/java/com/genexus/diagnostics/core/provider/Log4J2Logger.java

Lines changed: 69 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.genexus.diagnostics.LogLevel;
44
import com.genexus.diagnostics.core.ILogger;
5+
import com.genexus.json.JSONObjectWrapper;
56
import org.apache.logging.log4j.Level;
67
import org.apache.logging.log4j.LogManager;
78
import org.apache.logging.log4j.ThreadContext;
@@ -14,10 +15,7 @@
1415
import org.json.JSONArray;
1516
import 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

2220
public 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

Comments
 (0)