From f3c211f0a65a39838d860431d27d44eec2123918 Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Sat, 2 Aug 2025 17:07:55 +0200 Subject: [PATCH] clean(NightJson): improve code quality --- .../midnightdust/yaytris/util/NightJson.java | 121 +++++++++--------- 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/src/main/java/eu/midnightdust/yaytris/util/NightJson.java b/src/main/java/eu/midnightdust/yaytris/util/NightJson.java index 80980e6..95a4a94 100644 --- a/src/main/java/eu/midnightdust/yaytris/util/NightJson.java +++ b/src/main/java/eu/midnightdust/yaytris/util/NightJson.java @@ -25,10 +25,9 @@ public class NightJson { public NightJson(Class jsonClass, String fileLocation) { this.jsonClass = jsonClass; this.fileLocation = fileLocation; - try { - Field f = jsonClass.getField("jsonMap"); + getField("jsonMap").ifPresent(f -> { if (f.getType() == Map.class && getTypeArgument(f, 0) == String.class) jsonMap = f; - } catch (NoSuchFieldException ignored) {} + }); } @SuppressWarnings("unchecked") @@ -38,20 +37,17 @@ public class NightJson { FileWriter jsonFile = new FileWriter(fileLocation); jsonFile.write("{\n"); - { - Iterator it = Arrays.stream(jsonClass.getFields()).iterator(); - while (it.hasNext()) { - Field field = it.next(); - if (field == jsonMap) continue; - writeElement(jsonFile, field.get(null), field.getType(), field.getName(), it.hasNext()); - } + Iterator it = Arrays.stream(jsonClass.getFields()).iterator(); + while (it.hasNext()) { + Field field = it.next(); + if (field != jsonMap) writeElement(jsonFile, field.get(null), field.getType(), field.getName(), it.hasNext()); } if (jsonMap != null) { - Iterator it = ((Map)jsonMap.get(null)).keySet().iterator(); - while (it.hasNext()) { - String key = it.next(); + Iterator mapIt = ((Map)jsonMap.get(null)).keySet().iterator(); + while (mapIt.hasNext()) { + String key = mapIt.next(); Object value = jsonMap.get(key); - writeElement(jsonFile, jsonMap.get(key), value.getClass(), key, it.hasNext()); + writeElement(jsonFile, value, value.getClass(), key, mapIt.hasNext()); } } jsonFile.write("}"); @@ -73,6 +69,23 @@ public class NightJson { jsonFile.write(hasNext ? ",\n" : "\n"); } + private String objToString(Object value, Class type) { + if (type == Map.class) { + StringBuilder mapPairs = new StringBuilder(); + Map map = (Map) value; + Iterator it = map.keySet().iterator(); + if (it.hasNext()) mapPairs.append("{"); + while (it.hasNext()) { + Object key = it.next(); + Object val = map.get(key); + mapPairs.append(String.format("%s: %s", objToString(key, key.getClass()), objToString(val, val.getClass()))); + mapPairs.append(it.hasNext() ? "," : "}"); + } + return mapPairs.toString(); + } + return String.format(type == String.class || type.isEnum() ? "\"%s\"" : "%s", value); + } + @SuppressWarnings("unchecked") public void readJson() { if (fileLocation == null) return; @@ -83,7 +96,9 @@ public class NightJson { return; } - Map asMap = jsonToMap(Files.readString(file.toPath()).replaceAll("(//)+.*\n", ""), (key) -> getField(key).isPresent() ? getField(key).get().getType() : String.class); + Map asMap = jsonToMap( + Files.readString(file.toPath()).replaceAll("(//)+.*\n", ""), // Replace comment lines (Json5) + (key) -> getField(key).isPresent() ? getField(key).get().getType() : String.class); // Determine data type for (String key : asMap.keySet()) { Object value = asMap.get(key); @@ -110,58 +125,42 @@ public class NightJson { Matcher matcher = Pattern.compile(KEY_PATTERN).matcher(s); if (matcher.find()) { String key = matcher.group().replaceAll("([\":])", ""); - String val = s.split(KEY_PATTERN, 2)[1]; - - StringBuilder submapString = new StringBuilder(); - if (s.contains("{")) { - int level = charAmount(s, '{'); - submapString.append(val); - if (pairIterator.hasNext()) submapString.append(","); - while (pairIterator.hasNext()) { - String next = pairIterator.next(); - submapString.append(next); - if (next.contains("{")) level += charAmount(next, '{'); - if (next.contains("}")) level -= charAmount(next, '}'); - if (level <= 0) break; - if (pairIterator.hasNext()) submapString.append(","); - } - System.out.println(submapString); - } - if (submapString.length() > 0) { - Optional field = getField(key); - map.put(key, jsonToMap(String.valueOf(submapString), k -> field.isPresent() ? getTypeArgument(field.get(), 1) : String.class)); - } - else { - if (val.startsWith(" ")) val = val.substring(1); - val = val.replaceAll("[\"}\n]", ""); - if (val.endsWith(",")) val = val.substring(0, val.length() - 1); - - map.put(key, stringToObj(val, keyToType.apply(key))); - } + map.put(key, getValue(s, key, keyToType, pairIterator)); } } return map; } - private int charAmount(String input, char c) { - return (int) input.chars().filter(ch -> ch == c).count(); + + private Object getValue(String s, String key, Function> keyToType, Iterator pairIterator) { + String val = s.split(KEY_PATTERN, 2)[1]; + + if (s.contains("{")) { + StringBuilder submapString = new StringBuilder(); + int level = charAmount(s, '{'); + submapString.append(val); + if (pairIterator.hasNext()) submapString.append(","); + while (pairIterator.hasNext()) { + String next = pairIterator.next(); + submapString.append(next); + level += charAmount(next, '{'); + level -= charAmount(next, '}'); + if (level <= 0) break; + if (pairIterator.hasNext()) submapString.append(","); + } + Optional field = getField(key); + return jsonToMap(String.valueOf(submapString), k -> field.isPresent() ? getTypeArgument(field.get(), 1) : String.class); + } + else { + if (val.startsWith(" ")) val = val.substring(1); + val = val.replaceAll("[\"}\n]", ""); + if (val.endsWith(",")) val = val.substring(0, val.length() - 1); + + return stringToObj(val, keyToType.apply(key)); + } } - private String objToString(Object value, Class type) { - if (type == Map.class) { - StringBuilder mapPairs = new StringBuilder(); - Map map = (Map) value; - Iterator it = map.keySet().iterator(); - if (it.hasNext()) mapPairs.append("{"); - while (it.hasNext()) { - Object key = it.next(); - Object val = map.get(key); - mapPairs.append(String.format("%s: %s", objToString(key, key.getClass()), objToString(val, val.getClass()))); - if (it.hasNext()) mapPairs.append(","); - else mapPairs.append("}"); - } - return mapPairs.toString(); - } - return String.format(type == String.class || type.isEnum() ? "\"%s\"" : "%s", value); + private int charAmount(String input, char c) { + return (int) input.chars().filter(ch -> ch == c).count(); } private Object stringToObj(String value, Class type) {