clean(NightJson): improve code quality
This commit is contained in:
@@ -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<Field> 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<Field> 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<String> it = ((Map<String,?>)jsonMap.get(null)).keySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
String key = it.next();
|
||||
Iterator<String> mapIt = ((Map<String,?>)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<String, Object> asMap = jsonToMap(Files.readString(file.toPath()).replaceAll("(//)+.*\n", ""), (key) -> getField(key).isPresent() ? getField(key).get().getType() : String.class);
|
||||
Map<String, Object> 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> 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<String, Class<?>> keyToType, Iterator<String> 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> 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) {
|
||||
|
||||
Reference in New Issue
Block a user